簡體   English   中英

無法建立正確的RS485通訊

[英]Cannot establish proper RS485 communication

我正在嘗試使用ATmega32串行通信。 首先,我使用RS232,使用USB-to-RS232通過串行終端(在我的情況下為術語)建立接收和發送。 我從串行終端Atmega32發送的任何內容都將其回顯。

例如 我發送Hello\\r ,我收到“ Hello \\ r”

一切正常。

然后我使用RS485,使用USB-to-RS485與ATmega32建立通信,但我只得到第一個字符。

例如 如果我發送Hello我將返回H 如果我送出planets我只能得到p的回報。

這是代碼:

void Delay(int ms)
{
    int i;
    for (i=0;i<ms;i++)
    _delay_ms(1);

}

void UART_Init(unsigned int baud)
{
    UBRRH = (unsigned char)(baud >> 8);
    UBRRL = (unsigned char)baud;

    UCSRB = (1<<RXEN)  | (1<<TXEN) | (1<<RXCIE);
    UCSRC = (1<<URSEL) | (3<<UCSZ0);
}

void UART_Transmit(unsigned char data)
{
    UDR = data;
    while ( !( UCSRA & (1<<UDRE) ) );
}


void USART_Transmit_String( char *string)
{
    while (*string != 0)
    UART_Transmit(*string++);
}


void Clear_Buffer(char *string)
{
    while (*string != '\0')
    {
        *string = 0;
        string++;
    }
}

ISR(USART_RXC_vect)
{
    uartBuff[datapos] = UDR;
    if (uartBuff[datapos] == '\r')
    {
        eos = 1;
    }
    datapos++;
    if (datapos > SIZE)
    {
        datapos = 0;
        Clear_Buffer(uartBuff);
    }
}

int main(void)
{
    _delay_ms(1000);
    UART_Init(103);
    sei();
    LED_Enable();
    LED_High();
    Delay(100);
    LED_Low();
    Delay(100);

    RE_DE_Enable();
    RE_DE_High();
    USART_Transmit_String("Hello World");
    UART_Transmit(0x0d);
    UART_Transmit('\n');
    Delay(1000);
    datapos = 0;
    eos = 0;
    RE_DE_Low();
    while (1) 
    {
        if (strstr(uartBuff,"led on\r"))
        {
            LED_High();
        }
        if (strstr(uartBuff,"led off\r"))
        {
            LED_Low();
        }

        if (eos == 1)
        {
            RE_DE_High();
            uartBuff[datapos] = '\0';
            USART_Transmit_String("\r\n");
            USART_Transmit_String(uartBuff);
            USART_Transmit_String("\r\n");
            Clear_Buffer(uartBuff);
            datapos = 0;
            eos = 0;
            RE_DE_Low();
        }

    }
}

為什么會出現這種異常?

如何糾正此錯誤?

任何建議都會有所幫助。

提前致謝

對於誰在轉發此帖子時傳遞的內容有些困惑,因此有以下評論:

1)簡化Atmel代碼,使其僅輸出“ Hello World%d” + CR,並繼續增加行號。 現在,保持通訊速度為9600波特。 從Atmel到USB RS485加密狗的流量能否成功獲得100%的接收? 在此之前不要繼續。

2)在本設計中,您在Atmel側使用哪個RS485收發器? 市場上有很多垃圾,並非所有收發器都是一樣的。

3)您正在使用哪個USB RS485加密狗? 根據(2),只有極少數是可靠的。 如果使用透明的FTDI USB RS485加密狗,請非常仔細地檢查在塑料內部壓印了哪個RS485收發器。 FTDI承認他們推出了一些基於Sipex收發器的易碎加密狗電纜。 從我們的簡要回顧中,我們相信設計是錯誤的,而不是收發器。 但是,無論如何,由於加密狗已密封,因此無法修正同一越野車加密狗。

我們構建了一些可靠的適配器,但不希望將其轉換為廣告,因此讓我們看看是否可以調試您的情況。 發布更多詳細信息以繼續。

希望在RS485接收器引腳上添加該引腳,請確保在+ 3v3處有一個本地上拉電阻。 當RS485接收器被禁用時,要求在UART的Atmel接收上具有高狀態。 也就是說,當禁用RS485接收器時,RX引腳為高阻態。 已知10k的值不錯,該值並不嚴格,但建議上拉。

更新

我想我了解您的項目觀點。 如果我錯了,請更正。 您是否正在嘗試使用Teraterm + USB RS485加密狗通過RS485將文本發送到Atmel,並希望Atmel將數據發送回Teraterm? 如果是,那么如果您在Teraterm中鍵入此數據,則結果是合乎邏輯的。 請確認此設置。

也就是說,您是否鍵入“ Hello world”並希望收到此文本?

這個想法的問題是PC發送數據的速度快於您鍵入的速度。 相反,請查看如何使用Teraterm以宏形式將一個塊中的整個字符串發送出去。 只有這種方法才能滿足您的想法。 鍵入時,Teraterm通過RS485接口等發送(也刷新Tx緩沖區)“ H”,因此您不會在單個塊接收中接收到整個字符串。

考慮使用Teraterm宏以一次發送“行星”等。 關鍵是要發送的每個字符之間不要延遲。

485在傳輸數據時需要精確的線路控制。 UDRE表示可以加載數據。 TXC表示數據已發送。 僅在傳輸完最后一位后,才應釋放該行。 我相信這是它在rs232中工作而在rs485中失敗的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM