[英]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.