Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法建立正确的RS485通信_C_Avr_Atmega_Rs485 - Fatal编程技术网

C 无法建立正确的RS485通信

C 无法建立正确的RS485通信,c,avr,atmega,rs485,C,Avr,Atmega,Rs485,我正在尝试使用ATmega32进行串行通信。首先,我使用RS232,使用USB-to-RS232来建立使用串行终端的接收和传输(在我的例子中是tera术语)。无论我从串行终端Atmega32发送什么,都会将其回显 例如,我发送Hello\r并收到“Hello\r” 它工作得很好 然后我使用RS485,使用USB-to-RS485与ATmega32建立通信,但我只得到第一个字符作为回报 例如,如果我发送Hello,我将返回H。如果我发送planets,我只会得到p 代码如下: void Delay

我正在尝试使用ATmega32进行串行通信。首先,我使用RS232,使用USB-to-RS232来建立使用串行终端的接收和传输(在我的例子中是tera术语)。无论我从串行终端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();
        }

    }
}
无效延迟(整数毫秒)
{
int i;
对于(i=0;i>8);
UBRRL=(无符号字符)波特;

UCSRB=(1)传输数据时,485需要精确的线路控制。UDRE表示数据可以加载。TXC表示数据已经发送。只有在传输最后一位后,线路才应该释放。我相信这就是它在rs232中工作而在rs485中失败的原因。

485在传输数据时需要精确的线路控制。UDRE表示数据可以加载。TXC表示数据已经发送。只有在传输最后一位之后,线路才应该释放。我相信这就是它在rs232中工作而在rs485中失败的原因。

在查看此帖子时,对谁在传输内容感到困惑,因此有以下评论:

1) 将Atmel代码简化为只输出“Hello World%d”+CR,并不断增加行数。目前,请保持com速度为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引脚为高z。已知10k值为良好值,该值不是临界值,但p建议重新启动

更新

我想我理解您项目的观点。如果我错了,请更正。您是否试图使用Teraterm+USB RS485加密狗通过RS485向Atmel发送文本,并希望Atmel将数据发送回您的Teraterm?如果是,则如果您在Teraterm中键入此数据,则结果是合理的。请确认此设置起来

也就是说,您是否键入“Hello world”并期望收到此文本

这种想法的问题是,电脑发送数据的速度比您键入的速度快。相反,请查看如何使用Teraterm以宏形式发送块中的整个字符串。只有这种方法适用于您的想法。当您键入时,Teraterm正在发送(也称为刷新tx缓冲区)“H”通过RS485接口等,因此您不会在单个块接收中接收整个字符串


考虑使用Teraterm的宏在一次发送中发送“Planets”等。关键点不是要发送的每个字符之间的延迟。

在查看此帖子时,对谁在发送内容感到困惑,因此有以下评论:

1) 将Atmel代码简化为只输出“Hello World%d”+CR,并不断增加行数。目前,请保持com速度为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引脚为高z。已知10k值为良好值,该值不是临界值,但p建议重新启动

更新

我想我理解您项目的观点。如果我错了,请更正。您是否试图使用Teraterm+USB RS485加密狗通过RS485向Atmel发送文本,并希望Atmel将数据发送回您的Teraterm?如果是,则如果您在Teraterm中键入此数据,则结果是合理的。请确认此设置起来

也就是说,您是否键入“Hello world”并期望收到此文本

这种想法的问题在于,PC发送数据的速度比y快