【问题标题】:SerialPort & CCS String CommunicationSerialPort 和 CCS 字符串通信
【发布时间】:2014-07-22 11:09:25
【问题描述】:

我正在尝试通过 C# 发送/接收字符串,在 C# 中我只是这样做:

SerialPort.WriteLine("A6");

但在 CCS 中,如果我尝试在 char 之后发送字符串 char,它根本不起作用,无论是使用 ReadLine 还是使用 ReadExisting!这就是我尝试创建一个数组的方法,这样每次我们输入 RXBUFF 杂注时,我们都会将接收到的字符添加到数组中,直到数组已满(我随机将数组大小定义为 2,这意味着我们处理 2 -char-length 字符串),并最终通过在 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 ReadExisting)! 谁能告诉我为什么会这样?

【问题讨论】:

  • 您确认波特率和其他属性匹配了吗?
  • 是的!如果属性不匹配,我想最后一次尝试是行不通的,但它确实有效。你不同意我的观点吗?
  • @HansPassant 不是同一个问题。
  • 现在你知道在哪里提问了。

标签: c# file-transfer


【解决方案1】:

我刚刚中和了 Parity 位,现在一切正常,谢谢大家!

【讨论】:

    【解决方案2】:

    这表明您不应等待 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();
    }
    

    【讨论】:

    • 你说得对,它填充了一个 FIFO 缓冲区,这就是我正在使用数组做的事情,我认为这不是问题,但我仍然不明白有什么区别在 ISR 或 main 中发送字符之间!无论如何我按照你说的尝试了:postimg.org/image/cggftjfdl 但它也不起作用。
    • 在中和奇偶校验位后一切正常,但仅在 ISR 例程中而不是在 main 中(也只是使用 ReadExisting 但不是使用 ReadLine),多么奇怪!
    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多