串口,CCS字符串通信

本文关键字:通信 字符串 CCS 串口 | 更新日期: 2023-09-27 18:14:02

我试图通过c#发送/接收字符串,在c#中我只是做:

SerialPort.WriteLine("A6");

但在CCS,如果我尝试发送一个字符串字符后的字符它不工作在所有,既不是与ReadLine也与ReadExisting!这就是我尝试创建一个数组,以便每次我们进入RXBUFF pragma时,我们将接收到的char添加到数组中,直到数组满了(我随机定义了数组大小为2,这意味着我们处理2个字符长度的字符串),并最终通过发送char后的char发送字符串:

 #pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
if(__even_in_range(UCA1IV,18) == 0x02){          // Vector 2 - RXIFG
    if(counter==0)
    {
        Data[0]=UCA1RXBUF;
        counter++;
    }
    else
    {
        Data[1]=UCA1RXBUF;
        counter=0;
        UCA1TXBUF=Data[0];
        while(!(UCA1IFG & UCTXIFG)); // until UCTXBUF1 is empty
        UCA1TXBUF=Data[1];
    }
}
在c#:

 listBox2.Items.Add(SerialPort.ReadExisting());

我得到无意义的文本,像:??A??有时:????A?等。,但使用:

listBox2.Items.Add(SerialPort.ReadLine());

在我第一次按发送按钮发送"A6",我没有得到任何东西,第二次我得到无意义的,就像ReadExisting行为。

顺便说一下,即使我尝试以最简单的方式发送字符串(没有数组和条件),我的意思是:
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
        UCA1TXBUF='A';
        while(!(UCA1IFG & UCTXIFG));  // until UCTXBUF1 is empty
        UCA1TXBUF='6';

列表框中也有不一致的项。

但是,如果我这样做:

#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
UCA1TXBUF=UCA1RXBUF;

我在列表框中得到"A6",一切都很好(与ReadLine readexististing)!谁能告诉我为什么会这样?

串口,CCS字符串通信

我刚刚中和了奇偶校验位,现在一切正常,谢谢大家!

这表明您不应该在RX ISR中等待TX标志。RX中断例程应该简单地填充FIFO缓冲区(字节队列),以便您可以在其他地方解析其内容(主例程?),然后在需要时创建响应。

RX ISR的伪代码应该是这样的:

#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
FIFO_Enqueue(&RxBuffer, UCA1RXBUF);

main()循环的某个地方,你可以解析它的内容:

while (1) 
{
    // find the first occurrence of "A6" and dequeue it
    if (FIFO_StartsWith(&RxBuffer, "A6")
        SendResponse();
}