private void button_Query_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                byte[] data_temp = new byte[] { 0xaa, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0xff, 0xff };
                serialPort1.Write(data_temp, 0, data_temp.Length);
//......略        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                int length = serialPort1.BytesToRead;//......略
正常情况串口应该回发79个字节数组,为什么有时候要收几次才能收到79个字节的数组,大致意思就是说我单击查询按钮
触发button_Query_Click这个事件后,理想情况是serialPort1_DataReceived只触发一次,收到79个字节的数组。但是大部分时候都是serialPort1_DataReceived自动触发了2次以上,比如第一次收到8个字节的数组,第二次收到71个.也或者第一次收到3个字节,第二次收到76字节。
取的断点查看的serialPort1.BytesToRead是79。正常情况int length = serialPort1.BytesToRead;  length
求应该就是79,取断点看的length很多时候都不是79,比如是8 、71、3、76之类的本人嵌入式的小白。求高手解答。。3Q

解决方案 »

  1.   

    串口类有个threshold设置,你如果设置他为79,DataReceived只触发一次
    serialPort.ReceivedBytesThreshold = 79
      

  2.   

    接受的时候 等待一下sleep  或者 改变接受事件的执行频率,或者做个监听,来专门接受。 我还真没用过这个控件 貌似,以前做过一次 是直接 调用 port 类库里的api 呵呵,尝试下。
      

  3.   


    CheckForIllegalCrossThreadCalls = false;int length = serialPort1.BytesToRead;//清除接收缓冲区
    this.serialPort1.DiscardInBuffer();//清除发送缓冲区
    this.serialPort1.DiscardOutBuffer();
      

  4.   

    我很肯定。serialPort1.Write(data_temp, 0, data_temp.Length);只执行了一次。
      

  5.   


    那可不可以先统计个数之后再赋给serialPort.ReceivedBytesThreshold 
      

  6.   

    本人嵌入式的小小白白我觉得很正常啊
    serialPort1_DataReceived本来就是会触发N次的啊
    是要不断的接收信息的吧 程序要缓存着啊设置断点后 触发serialPort1_DataReceived后程序暂停了"太久"后面的信息自然全到齐了啊不是这样吗
      

  7.   

    socket通信有个缓冲区的东西,你把缓冲区弄大点,一次发送多点,应该就没有问题了吧。或者你业务上处理下。然后积攒到足够的时候在发送。