没有收到所有的串行数据

时间:2015-08-19 00:44:05

标签: c# .net

我已经尝试过我能在网上找到的所有内容,但没有任何帮助,所以我必须向你们求助,以获得一点点启发。

我正在使用Visual C#2013,.NET Framework 4.5(我希望我的标签正确无误)

我已经编写了很长一段时间的嵌入式代码,而且我对它很满意。这个c#的东西是完全不同的动物。

我在ARM微控制器上编写了一个程序,该程序与C#程序串行通信。我99.9%确定微控制器正在正确发送所有内容。我已经使用Realterm来查看数据,但一切看起来都不错,但我不能让我的C#程序以我认为的方式接收所有数据。

微控制器和c#程序都设置为相同的设置(57600波特,8个数据位,无握手,无奇偶校验,一个停止位)那里没什么大不了的。

我的问题是如果我将ReceiveByteThreshold设置为1,并且程序得到一个字节并被发送到ISR(不确定ISR是否是c#中的正确术语,但那是我称之为的内容) )。这就是我理解它应该起作用的方式。

我有以下代码来获取字节。

GlobalVars.data_byte是100个字节的arraybytes_to_read设置为100。

serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read)

我的问题是,如果我查看serialPort1.Read函数的返回值,它会在5到13个字节之间反弹,但我会从微控制器发送21个字节。出于某种原因,它并没有全部获得。

现在,如果我设置ReceiveByteThreshold = 13,则返回值会在13到16之间反弹。如果我设置ReceiveByteThreshold = 14(或任何高达21的值),则返回值是一个很好的稳定21,因为它应该是

我错过了什么吗?我认为这应该工作的方式是,如果ReceiveByteThreshold = 1程序将在读取第一个字节后立即发送到ISR并且

  serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read) 

将读取所有字节,直到它看到停止位。这意味着它应该读取所​​有21个字节。

我不能简单地ReceiveByteThreshold = 14,因为我发送的所有数据都不是21个字节。有时它只有2个字节,ISR永远不会被触发。

我希望我说得够清楚。

1 个答案:

答案 0 :(得分:0)

一次......我的情况差不多。 因为像我们的朋友说的那样,有时它并不能立即得到所有数据 看看收到了。我发布了我的代码,希望它有所帮助:

var End = '\r'; //Last character for searching
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);

RxString = Encoding.ASCII.GetString(data);
txtCodProd.AppendText(RxString);

if (RxString.IndexOf((char)End) > -1)
{
    this.Invoke(new EventHandler(EndMethod));  //After Get all data, DoSomething    
} 

//RxString = _serialPort.ReadExisting(); // doesn't Work for all data