C#串口缓存数据出错问题 c#缓存数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 上面的程序可能有点乱...我是菜鸟...写的不好希望各位不要见怪...我加上注释 do { sp.Write(baotou(), 0, 6);//发送包头 sp.Write(luru(), 0, 6);//发送录入指令(成功接收到指令,指纹模块会闪一次--检测一次) Thread.Sleep(1000);//延时1秒 //sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次 sp.Read(buffer, 0, 12);//读返回的数据 while (buffer.Length != 12) ;//这是我自己加的判断 str = byteToHexStr(buffer); textBox2.Text = str;//我希望能看到模块每次返送的应答包,但是TextBox2总是空的,要等很久才会显示一个正确的应答包(30秒左右) Thread.Sleep(1000); }while (!str.Equals("EF01FFFFFFFF07000300000A")) ; MessageBox.Show("首次录入成功", "提示"); textBox2.Text = str; 串口不是IP包,不是整个包一起来的,其实是一个一个字节来的如果你sleep(1000)的过程中刚好来了一个完整的包,你就能收到正确数据如果你处理的时候刚好是它发了一半的时候,那当然就出错了.你需要将来的内容存起来,自己拼个字符串,再去判断而且判断不能直接写到while()里,否则来的包错误,你循环就无法终止了你得判断串口缓冲区没有数据了,就结束循环,然后判断来的内容是否正常,不正常就重新发个指令 while (buffer.Length != 12) ;还有这句是啥呀!while后面直接加了个分号,没有处理?如果来的字节不是12,你程序就死了!一直在跑循环,出不来 //sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次你加这个,当然不行了要加也是发送之前加.你发送完数据,等了1秒,该来的数据都来了,你给清了,还上哪能得到12个字节去,不就跑死循环里取了么 大哥谢谢你啊,我的帖子你回了好多...我想用最笨的方法,清空缓存 - 发送 - 延时1秒 - 接收 - 延时1秒 - 将应答包转成字符显示在TextBox2.但是问题又来了,模块闪了至少15下,TextBox2才显示出应答包(正确的),这是怎么回事?不是应该在第一次(清空缓存 - 发送 - 延时1秒 - 接收 - 延时1秒 - 将应答包转成字符显示在TextBox2)这个过程中,TextBox2就会显示出应答包吗? do { sp.DiscardInBuffer();//清除缓存数据 sp.Write(baotou(), 0, 6);//发送包头 sp.Write(luru(), 0, 6);//发送录入指令(成功接收到指令,指纹模块会闪一次--检测一次) Thread.Sleep(1000);//延时1秒 //sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次 sp.Read(buffer, 0, 12);//读返回的数据 Thread.Sleep(1000);//延时1秒 str = byteToHexStr(buffer); textBox2.Text = str;//我希望能看到模块每次返送的应答包,但是TextBox2总是空的,要等很久才会显示一个正确的应答包(30秒左右) Thread.Sleep(1000); }while (!str.Equals("EF01FFFFFFFF07000300000A")) ; MessageBox.Show("首次录入成功", "提示"); textBox2.Text = str; 感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回. 感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.我是用sp.B....= 57600这样的函数进行设置参数的.另外我有注意到模块上有rx tx,而且是交替亮的.大哥你能帮我看看我后来写的程序吗?或者按照你的经验,你会以什么样的思路去编写这段程序.? 感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.这是我设置断点于该循环后,查看局部变量的图.我第一次点逐过程翻译,就已经能得到正确的应答包.但是我又去掉断点,再编译,发现textbox还是没显示东西.然后我在str后面加上了.ToString();问题依然存在.还是要很久.大哥我想请教下有没有方法可以逐个逐个读串口传来的数据,当读到的数据的前6无位是EF01FFFFFFFF时才存入buffer? sp.Read(buffer, 0, 12)改为sp.Read(buffer, 0, 1)就行了每次只读1个字节 Winfrom中panel如何右对齐 怎么把动态图片放在PictureBox里?要会动的 求高手帮忙!!C#调用硬件驱动问题 高手指点,这个功能可以实现么? windows应用服务——无法调试 急送5分,用户控件中如何调用外部js脚本? 问一个菜问题,别笑话 C#,高手进,求一英语分词方法 一般企业级解决方案的数据库操作需要把WEB SERVICES和COM+结合使用吗?还有对象入池 讨论、探索、进步(希望各位大虾提供一控件开发方案) 登录窗口和主窗体设计的问题 windows8.1 64位环境 vs2008 运行报找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
{
sp.Write(baotou(), 0, 6);//发送包头
sp.Write(luru(), 0, 6);//发送录入指令(成功接收到指令,指纹模块会闪一次--检测一次)
Thread.Sleep(1000);//延时1秒
//sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次
sp.Read(buffer, 0, 12);//读返回的数据
while (buffer.Length != 12) ;//这是我自己加的判断
str = byteToHexStr(buffer);
textBox2.Text = str;//我希望能看到模块每次返送的应答包,但是TextBox2总是空的,要等很久才会显示一个正确的应答包(30秒左右)
Thread.Sleep(1000);
}while (!str.Equals("EF01FFFFFFFF07000300000A")) ;
MessageBox.Show("首次录入成功", "提示");
textBox2.Text = str;
如果你sleep(1000)的过程中刚好来了一个完整的包,你就能收到正确数据
如果你处理的时候刚好是它发了一半的时候,那当然就出错了.
你需要将来的内容存起来,自己拼个字符串,再去判断而且判断不能直接写到while()里,否则来的包错误,你循环就无法终止了
你得判断串口缓冲区没有数据了,就结束循环,然后判断来的内容是否正常,不正常就重新发个指令
如果来的字节不是12,你程序就死了!一直在跑循环,出不来
你加这个,当然不行了
要加也是发送之前加.
你发送完数据,等了1秒,该来的数据都来了,你给清了,还上哪能得到12个字节去,不就跑死循环里取了么
大哥谢谢你啊,我的帖子你回了好多...
我想用最笨的方法,清空缓存 - 发送 - 延时1秒 - 接收 - 延时1秒 - 将应答包转成字符显示在TextBox2.但是问题又来了,模块闪了至少15下,TextBox2才显示出应答包(正确的),这是怎么回事?不是应该在第一次(清空缓存 - 发送 - 延时1秒 - 接收 - 延时1秒 - 将应答包转成字符显示在TextBox2)这个过程中,TextBox2就会显示出应答包吗? do
{
sp.DiscardInBuffer();//清除缓存数据
sp.Write(baotou(), 0, 6);//发送包头
sp.Write(luru(), 0, 6);//发送录入指令(成功接收到指令,指纹模块会闪一次--检测一次)
Thread.Sleep(1000);//延时1秒
//sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次
sp.Read(buffer, 0, 12);//读返回的数据
Thread.Sleep(1000);//延时1秒
str = byteToHexStr(buffer);
textBox2.Text = str;//我希望能看到模块每次返送的应答包,但是TextBox2总是空的,要等很久才会显示一个正确的应答包(30秒左右)
Thread.Sleep(1000);
}while (!str.Equals("EF01FFFFFFFF07000300000A")) ;
MessageBox.Show("首次录入成功", "提示");
textBox2.Text = str;
感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.
感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.
我是用sp.B....= 57600这样的函数进行设置参数的.
另外我有注意到模块上有rx tx,而且是交替亮的.
大哥你能帮我看看我后来写的程序吗?或者按照你的经验,你会以什么样的思路去编写这段程序.?
感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.这是我设置断点于该循环后,查看局部变量的图.我第一次点逐过程翻译,就已经能得到正确的应答包.
但是我又去掉断点,再编译,发现textbox还是没显示东西.
然后我在str后面加上了.ToString();问题依然存在.还是要很久.大哥我想请教下有没有方法可以逐个逐个读串口传来的数据,当读到的数据的前6无位是EF01FFFFFFFF时才存入buffer?
改为sp.Read(buffer, 0, 1)就行了
每次只读1个字节