C# SerialPort&;字符串通信
我正在尝试通过C#发送/接收字符串,在C#中,我只执行以下操作:C# SerialPort&;字符串通信,c#,file-transfer,C#,File Transfer,我正在尝试通过C#发送/接收字符串,在C#中,我只执行以下操作: SerialPort.WriteLine("A6"); 但在CCS中,如果我尝试一个字符接一个字符地发送字符串,它根本不起作用,无论是ReadLine还是ReadExisting!这就是我尝试创建的数组,因此每次输入RXBUFF pragma时,我们都会将收到的字符添加到数组中,直到数组已满(我随机将数组大小定义为2,这意味着我们要处理2个字符长度的字符串),并最终通过一个字符接一个字符发送字符串: #pragma vecto
SerialPort.WriteLine("A6");
但在CCS中,如果我尝试一个字符接一个字符地发送字符串,它根本不起作用,无论是ReadLine还是ReadExisting!这就是我尝试创建的数组,因此每次输入RXBUFF pragma时,我们都会将收到的字符添加到数组中,直到数组已满(我随机将数组大小定义为2,这意味着我们要处理2个字符长度的字符串),并最终通过一个字符接一个字符发送字符串:
#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#中:
我得到了无意义的文本,比如:?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和ReadExisting)!
谁能告诉我为什么会这样 这表示您不应该在接收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();
}
我刚刚抵消了奇偶校验位,现在一切正常,谢谢大家 您确认波特率和其他属性匹配了吗?是的!如果属性不匹配,我想最后一次尝试是行不通的,但确实有效。你不同意我吗?@HansPassant这不是同一个问题。现在你知道该问什么问题了。你是对的,它填充了一个FIFO buff,这就是我使用数组所做的,我认为这不是问题所在,但我仍然不明白在ISR或main中发送字符有什么区别!不管怎样,我试着像你说的那样:但它不起作用。在中和奇偶校验位之后,一切都很好,但只在ISR例程中工作,而不是在main中(也只是使用ReadExisting,但不使用ReadLine),真奇怪!
while (1)
{
// find the first occurrence of "A6" and dequeue it
if (FIFO_StartsWith(&RxBuffer, "A6")
SendResponse();
}