读书人

C# 关于处置串口数据

发布时间: 2013-08-11 22:22:29 作者: rapoo

C# 关于处理串口数据
这个问题很莫名其妙,我自己也在网上查了些资料,感觉老是没抓住重点,希望懂的人点拨我一下,谢谢。
问题是这样的,点击读取数据按钮,启动两个线程:
...
Thread read = new Thread(new ThreadStart(delegate()
{
ReadPortDataToQueue(串口对象实例ps, 队列ref queue);
}));
Thread write = new Thread (new ThreadStart(delegate()
{
AddDataToDataTable(队列ref queue, 全局临时表ref dt);
}));
read.Start();
write.Start();
...
private void ReadPortDataToQueue(SerialPort sp,Queue<byte[]> queue)
{
sp.ReadToQueue(命令command, ref dt)
}
...
void ReadToQueue(byte[] command,ref Queue<byte[]> queue)
{
for(int i = 0; i < LoopTimes; i++)
{
sp.Write(command,0,4);//给串口发命令;
Thread.Sleep(BUFFER_TIME);//等待数据缓冲好;
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer,0,buffer,Length);
sp.DiscardInBuffer();//情况串口缓冲数据;
queue.Enqueue(buffer);//入队列;
}
sp.Close();
}
...
private void AddDataToDataTable(ref Queue<byte[]> queue, ref DataTable dt)
{
byte[] tempDataStr = null;
while(true)
{
if(queue.Count > 0)
{
tempDataStr = queue.Dequeue();
一个字符串数组 s = TranslateData(tempDataStr);
dr = dt.NewRow();
dr.ItemArray = new Object[] {s[0], ....};
dt.Rows.Add(dr);
}



}
...
string[] TranslateData(byte[] data)
{
//将每一个字节转换成16进制;
//处理各个字节信息;
这里跳出错误,因为我要把信息赋值给字符串,所以将上面转换的信息赋值给了一个stringbuild对象实例,
装箱后为string,用substring方法时,抛出错误,ArgumentOutOfRangeException,我查看了是因为字符串为空,但是,我一步一步调试却没有发生这种情况,不知道为什么,我明明从队列中取出数据,处理的时候也没有删除操作什么的,为什么就成空了呢?
//赋值给字符串数组s;

}


若还需要什么信息,请更贴我会解释,希望大家帮忙一下,在下感激不尽。















C# 线程 串口
[解决办法]
ArgumentOutOfRangeException范围超出,substring截取时,索引超出了内容的长度,肯定是接受的内容有问题啊,慢慢调试吧
[解决办法]
queue.Count > 0不一定代表你的数据完整
你截取出错也正常
说明你的串口数据还没读取完

[解决办法]
你报错的地方不贴代码,没错的贴代码,晕。估计肯定是截取有问题。
话说难道你断点走的时候都不报错么?
[解决办法]
串口丢数据时很严重的,一个小引脚松了都会差别很大。
关于上面的:
1.时间不固定,根据机器硬件和其他延迟会有几MS的误差吧。
2.已经清除了
3.没理解,sorry

读书人网 >C#

热点推荐