中断发送和接收字符串

时间:2014-06-20 04:35:00

标签: c string avr uart avr-studio5

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

直到现在,我才得到这个 - >

    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;
}

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

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

这个问题与to your other question有关。从我看到的,你现在想要采用中断驱动的方法。

您应该熟悉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教程,因为你缺乏一些基本的理解。