-1

任何人都可以显示一些示例代码或链接来帮助我解决这个问题。我想使用终端接收和传输字符串。

到目前为止,我只得到了这个-->

    void usart_init(void)
    {

        UBRRH = 0x00;
        UBRRL = 95;
        UCSRB =  (1 << RXEN) | (1 << TXEN) | **(1<<RXCIE)**; 
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)|(1 << UCSZ1); 
    }

    ISR (USART_RXC_vect)
    {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS

    }
int main (void)
{
   usart_init();
   while(1)
    {
      sei();
    }
   return 0;
}

但这只能发送和接收一个字符。如何修改此代码以使其能够发送和传输字符串

感谢您的帮助:)

4

1 回答 1

0

这个问题与你的另一个问题有关。据我所知,您现在想采用中断驱动的方法。

您应该熟悉 C 中一般如何处理字符串。本质上,您会将任何接收到的字符写入一个数组(这将是您接收缓冲区)。所以而不是

ReceivedByte = UDR

你会写这样的东西

_ReceiveBuffer[i++] = UDR

其中 _ReceiveBuffer 可以是这样的全局数组

char _ReceiveBuffer[100];

例如。您显然必须检查缓冲区溢出,并且可以使用一些指针算法来处理内容,但这应该可以帮助您入门。

对您的代码的一些评论:

ISR (USART_RXC_vect) {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS
}

您不应该从 ISR 中回显数据或做任何耗时的事情,否则可能会阻塞 ISR。虽然此特定代码可以工作,但您不会等待数据传输,这不是一个好习惯。
你确定你甚至使用硬件握手吗?在您之前的帖子中,它看起来不像,因此您可以删除切换潜在 RTS 信号的两条线。

while(1) {
    sei();
}

连续打电话sei()是没有意义的。sei()启用全局中断标志,一次就足够了。

我建议阅读一些 C 和 AVR 教程,因为您缺乏一些基本的了解。

于 2014-06-20T07:18:55.003 回答