解决方案 »

  1.   

    上面的程序可能有点乱...我是菜鸟...写的不好希望各位不要见怪...我加上注释            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;
      

  2.   

    串口不是IP包,不是整个包一起来的,其实是一个一个字节来的
    如果你sleep(1000)的过程中刚好来了一个完整的包,你就能收到正确数据
    如果你处理的时候刚好是它发了一半的时候,那当然就出错了.
    你需要将来的内容存起来,自己拼个字符串,再去判断而且判断不能直接写到while()里,否则来的包错误,你循环就无法终止了
    你得判断串口缓冲区没有数据了,就结束循环,然后判断来的内容是否正常,不正常就重新发个指令
      

  3.   

    while (buffer.Length != 12) ;还有这句是啥呀!while后面直接加了个分号,没有处理?
    如果来的字节不是12,你程序就死了!一直在跑循环,出不来
      

  4.   

    //sp.DiscardInBuffer();//清除缓存数据,但是添加后循环无法继续,指纹模块只闪一次
    你加这个,当然不行了
    要加也是发送之前加.
    你发送完数据,等了1秒,该来的数据都来了,你给清了,还上哪能得到12个字节去,不就跑死循环里取了么
      

  5.   


    大哥谢谢你啊,我的帖子你回了好多...
    我想用最笨的方法,清空缓存 - 发送 - 延时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;
      

  6.   


    感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
    没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
    然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
    串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.
      

  7.   


    感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
    没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
    然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
    串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.
    我是用sp.B....= 57600这样的函数进行设置参数的.
    另外我有注意到模块上有rx tx,而且是交替亮的.
    大哥你能帮我看看我后来写的程序吗?或者按照你的经验,你会以什么样的思路去编写这段程序.?
      

  8.   


    感谢提醒.~!我在用这个模块之前有对串口的一些参数进行设置,那边应该没问题的
    没错,波特率不正确的话,你一次正确的数据也别想得到.建议你断点调试,先看发送的数据有没有问题,是每次都发一样的数据,还是做了个算法,每次发的都不一样?
    然后再看收到的数据是什么.根据你的描述,前14次根本没有数据返回.
    串口设备上应该有Tx和Rx指示灯吧,你看看到底是只有一个在亮,还是交替亮的,能看出设备到底给没给返回.这是我设置断点于该循环后,查看局部变量的图.我第一次点逐过程翻译,就已经能得到正确的应答包.
    但是我又去掉断点,再编译,发现textbox还是没显示东西.
    然后我在str后面加上了.ToString();问题依然存在.还是要很久.大哥我想请教下有没有方法可以逐个逐个读串口传来的数据,当读到的数据的前6无位是EF01FFFFFFFF时才存入buffer?
      

  9.   

    sp.Read(buffer, 0, 12)
    改为sp.Read(buffer, 0, 1)就行了
    每次只读1个字节