这个问题很莫名其妙,我自己也在网上查了些资料,感觉老是没抓住重点,希望懂的人点拨我一下,谢谢。
问题是这样的,点击读取数据按钮,启动两个线程:
...
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#线程串口
问题是这样的,点击读取数据按钮,启动两个线程:
...
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#线程串口
解决方案 »
- c#处理excel出现错误的问题?
- File.AppendAllText和File.AppendText有什么区别?多线程操作同一个文档哪个效率高?
- C#服务方式进程间通讯,
- 没分了。。。请那位好心的人帮我来看看啊 万分感谢啊
- 如何把16进制asc码还原成汉字
- .net 2005 express 版本 的remote 怎么不能用啊?
- 关于.NET的forms认证问题
- 请问高手:软件做好了后,怎样实现补丁程序
- 操作无效,原因是它导致对SetCurrentCellAddressCore 函数的可重入调用
- 怎么访问arraylist的第一个元素?
- 请教:win8系统64位环境下VS2010,C#开发的兼容性问题
- ORA-01000: 超出打开游标的最大数!! 在线急等!
你截取出错也正常
说明你的串口数据还没读取完
1.我发送命令到串口,然后那边返回数据到串口缓冲,这个中间时间是多少,是和机器相关的一个固定值吗?
2.我读取数据后,serialPort.Read(...)后,这些数据还在串口缓冲区呢,还是已经被清除了呢?
串口缓冲区也是一个阻塞模型吗?它的容量是多大?是在我的电脑上呢?还是在和我连接的串口机子上呢?
3.我现在想用队列操作这些数据,本来一个线程往里面添加数据,另一个线程从队列取数据理论上可行,但是我实现的时候需要两个线程都引用(ref)这个队列呢? 那这样是不是会有访问临界资源的问题?En/De Queue是在队列的两头操作,是两个指针不相关的,会有问题吗?我在书上看C#队列在内存中实际上维护的是一个环形数组,这个和我要实现的有牵连吗?还是每次不要加ref关键字,使用队列的copy?这样会不会太费资源了,感觉也不优雅。我乱乱的说了一大堆,希望有明白的人指点一下,或者相互讨论。谢谢
是这样的,我处理字节的时候是已经把串口发送的结束字节删去了,在队列中我只添加每一个数据条,然后处理每一个byte[],这个是固定的81个字节,但是到其中某一个,或者最后一个,就会出问题抛出处理后的字符串为"",因为我解码时遇到整个通信结束字节就断定结束,但是我查看我的字节数组,是正确的,没有一个是81+4字节,不知道是什么原因。
关于上面的:
1.时间不固定,根据机器硬件和其他延迟会有几MS的误差吧。
2.已经清除了
3.没理解,sorry