none
串口 RRS feed

  • 问题

  • 在做串口的时候,有许多条命令,其中有些命令返回的字节数不确定,这种情况大家一般怎么处理,谢谢
    2010年5月27日 9:08

答案

  • 如果两个窗体在同一进程中,可以为serialPort控件添加一个委托和一个事件,在另一个需要显示数据的窗体中去注册该事件,

    当serialPort控件接收新数据后就触发该事件,相应的在另一个窗体中会调用该事件注册函数,在此函数中就可以编写显示数据的逻辑。

    2010年5月29日 3:21

全部回复

  • 你好!

         通常是写一个while循环,不停的获取,直到取完所有的数据为止啊!


    周雪峰
    2010年5月27日 10:19
    版主
  • 雪峰,您好!

    您意思是触发一次,取一次,直到缓冲区里没有数据为止,是吗?有没有小的demo,可以借我看看,谢谢

    2010年5月27日 11:22
  • 你好!

        具体可以参考:

    http://developer.51cto.com/art/200908/146713.htm

        希望对你有帮助!


    周雪峰
    2010年5月27日 11:40
    版主
  • 这也行?
    2010年5月27日 12:58
  • 雪峰,您好!

    我现在的问题是,因为读取的字节数不确定,我没法定义这个buffer的长度,就是放在while循环里,也不清楚read方法的偏移量应该是多少?

    我不知道我的问题描述清了吗?

    2010年5月27日 13:19
  • 你好 你可以先声明一个容量比较大的byte[] 比如10240等(大于BytesToRead)  然后每次比如读取100个字节

    偏移量根据每次实际读取的字节数即Read方法返回的int来相应的增加,至少某次读取数据为0了表示已经读取完毕


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~
    2010年5月28日 2:17
    版主
  • Raymond Tang 版主  您好!

       关于这个问题,我已经找到了解决的办法,我声明了一个arraylist ReceivStr,在dataReceived事件中是这样写的

     loop:
                    while (serialPortComm.BytesToRead != 0)
                    {
                      
                        buffer = new char[serialPortComm.BytesToRead];
                        serialPortComm.Read(buffer, 0, buffer.Length);
                        ReceivStr.AddRange(buffer);
                      
                       
                    }
                     if (不是终结符)//如果没有取完,继续
                        {
                            goto loop;
                        }

     

    但是我又遇到了新的问题,我取出来的数据将要显示在另一个窗体上,我该如何做?谢谢

    2010年5月28日 8:19
  • 另一个窗体?是另一个进程的窗体吗?

    2010年5月28日 8:23
  • 另一个进程的窗体?有区别吗?不太明白您的意思
    2010年5月28日 9:25
  • 当然有区别,同一个进程的窗体,可以简单的使用公共静态变量传值,而两个进程之间的话,则需要采取其它方式,

    比如命名管道,消息队列,socket,文件等.

    2010年5月28日 9:50
  • Galactica,您好!

                   老实说,我真不知道是不是同一进程,就是两个窗体,serialPort控件在一个窗体上,取出来的数要显示在另一个窗体上。

    2010年5月29日 2:34
  • 那我告诉你一个简单的方式,

    serialPort控件收完数据后写入一个文件:d:\message.txt;

    FileShare 设置为共享读。

    另一个窗体不停的去读d:\message.txt; 如果文件被更新过,则读取数据,然后把数据显示到窗体上。

    2010年5月29日 2:46
  • Galactica,您好

                  你这个方法特别好,但是还有没其他办法,或者更好点的办法

    2010年5月29日 2:56
  • Galactica ,您好!

                  等待你的回复

    2010年5月29日 3:14
  • 如果两个窗体在同一进程中,可以为serialPort控件添加一个委托和一个事件,在另一个需要显示数据的窗体中去注册该事件,

    当serialPort控件接收新数据后就触发该事件,相应的在另一个窗体中会调用该事件注册函数,在此函数中就可以编写显示数据的逻辑。

    2010年5月29日 3:21