我已经尝试过我能在网上找到的所有内容,但没有任何帮助,所以我必须向你们求助,以获得一点点启发。
我正在使用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个字节的array
,bytes_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永远不会被触发。
我希望我说得够清楚。
答案 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