串口,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)!谁能告诉我为什么会这样?
我刚刚中和了奇偶校验位,现在一切正常,谢谢大家!
这表明您不应该在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();
}