我单步调试时:
界面textbox上显示ARM饭回来的数据:
F0037E018E70011701060000FFFF014444444444444444444444444270011
701060000FFFF01666666666666666666666666AA
70011701060000FFFF0155555555555555555555555576F0037E048B
(上面在文本框显示是没有换行的)取掉断点,全速跑时的,textBox上显示的数据:F0037E018E70011701060000FF
FF01666666666666666666666666AA70011701060000FFFF01555555555555
5555555555557670011701060000FFFF0144444444444444444444444442
F0037E048B
(上面是换行产生的效果)
断点调试和全速跑,都收全了数据
不同的是
断点时, 数据是拼到一个临时数组里,是全的,,即本次所有数据都收齐了而全速跑时,,从界面上显示的情况看,拼数据到数组里有错了,4次才完成因为我在向界面显示时,每次都加一个换行
如代码:
this.txGet.AppendText(str+"\r\n");
如何才能保证,全速跑时,能像断点那样,,将数据拼接对呢?接受的全部代码如下:
int n = comm.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 bool data_1_catched = false;
string str = "";
received_count += n;//增加接收计数
temp_Counter += n;
comm.Read(buf, 0, n);//读取缓冲数据 if (n > 0)
{
Array.ConstrainedCopy(buf, 0, binary_data_1, temp_Counter - n, n); if (temp_Counter - n > 0)
data_1_catched = true;
//正确分析一条数据,从缓存中移除数据。
// Array.Clear(buf, 0, buf.Length);
} if (data_1_catched)
{
this.Invoke((EventHandler)(delegate
{
for (int i = 0; i < temp_Counter; i++)
{
str += binary_data_1[i].ToString("X2");
}
this.txGet.AppendText(str+"\r\n");
temp_Counter = 0;
data_1_catched = false;
Array.Clear(binary_data_1, 0, binary_data_1.Length);
//修改接收计数
labelGetCount.Text = "Get:" + received_count.ToString();
}));
界面textbox上显示ARM饭回来的数据:
F0037E018E70011701060000FFFF014444444444444444444444444270011
701060000FFFF01666666666666666666666666AA
70011701060000FFFF0155555555555555555555555576F0037E048B
(上面在文本框显示是没有换行的)取掉断点,全速跑时的,textBox上显示的数据:F0037E018E70011701060000FF
FF01666666666666666666666666AA70011701060000FFFF01555555555555
5555555555557670011701060000FFFF0144444444444444444444444442
F0037E048B
(上面是换行产生的效果)
断点调试和全速跑,都收全了数据
不同的是
断点时, 数据是拼到一个临时数组里,是全的,,即本次所有数据都收齐了而全速跑时,,从界面上显示的情况看,拼数据到数组里有错了,4次才完成因为我在向界面显示时,每次都加一个换行
如代码:
this.txGet.AppendText(str+"\r\n");
如何才能保证,全速跑时,能像断点那样,,将数据拼接对呢?接受的全部代码如下:
int n = comm.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 bool data_1_catched = false;
string str = "";
received_count += n;//增加接收计数
temp_Counter += n;
comm.Read(buf, 0, n);//读取缓冲数据 if (n > 0)
{
Array.ConstrainedCopy(buf, 0, binary_data_1, temp_Counter - n, n); if (temp_Counter - n > 0)
data_1_catched = true;
//正确分析一条数据,从缓存中移除数据。
// Array.Clear(buf, 0, buf.Length);
} if (data_1_catched)
{
this.Invoke((EventHandler)(delegate
{
for (int i = 0; i < temp_Counter; i++)
{
str += binary_data_1[i].ToString("X2");
}
this.txGet.AppendText(str+"\r\n");
temp_Counter = 0;
data_1_catched = false;
Array.Clear(binary_data_1, 0, binary_data_1.Length);
//修改接收计数
labelGetCount.Text = "Get:" + received_count.ToString();
}));
解决方案 »
- 如何使用C#语言对一个excel文件进行搜索,并返回搜索结果的右侧单元格中的内容
- C#怎么实现主窗口显示结束后显示一个系统初始化窗口
- js 画园(小弟是初学 请大家指教)
- c# 写的web服务 不支持FLV拖放播放问题
- 我有一个c#windows 连接mysql数据库的问题
- g.DrawPie(pen3, lgRectangle, 60, 240);//?????????????????????????????????????????????????
- 请教我用C#连接Oracle老是提示命名空间System.Data中不存在OracleClient(!急!!拜托了)
- DataSet 的Update()! 我今天喝了点酒,本来这个问题我都不敢在问了!
- 获取datagrid当前行特定列的值(winform)
- 请问有没有好用的富文本过滤器,用来防范xss攻击
- 设计时实现“文档大纲”
- 求大侠指教,万分感谢
刚试了一下 在接受函数,前加一个延时就OK了
但这个不是一个办法呀
comm.Read(buf, 0, n);//读取缓冲数据
Thread.Sleep(200); 有啥更好的办法么有?
1、把接收数组设置成全局变量,且能扩充大小的List<byte>类型
2、再开一个线程去解析List<byte>里面的数据
3、在串口接收事件和线程解析中注意对List<byte>的同步
2 事件是不是就类似一个线程了啊?,,事件里可以再启线程?
3 事件和线程又怎么同步呢?
2、事件不是线程,但是事件的执行一般都是由系统另开线程来执行的
3、在读取或写入List<byte>数组前先锁定数组对象,Monitor或者lock
奇怪了
我在 串口接收事件里 开启线程不了呀
if (data_1_catched)
{
revcThread = new Thread(new ThreadStart(revc));//定义接收线程
revcThread.Start();//开始接收线程
}
可以改成这样来处理,假如串口设置了超时(如果没设置超时根本就没必要用DataReceived事件): int isread = 0;
byte[] buffer = new byte[64];//长度根据你的协议需要定义
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (Interlocked.CompareExchange(ref isread, 1, 0) != 0)
return;
while (true)
{
try
{
int recvlen = comm.Read(buffer, 0, buffer.Length);
//程序对接收到的buffer的处理过程,实际接收长度为recvlen
}
catch
{
break;
}
}
Interlocked.CompareExchange(ref isread, 0, 1);
}