我在进行串口通讯测试时遇到一个问题,求高手帮助我一下,问题如下:
首先我新建一个C#窗体应用程序,分别添加一个checkbox1, textbox1,button1,
Public System.IO.Ports.SerialPort serial1 = new 
System.IO.Ports.SerialPort();
//声明一个串口控件
private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked == true)
            {
                if (serial1.IsOpen == true)
                {
                    serial1.Close();
                }
                serial1.BaudRate = 9600;
                serial1.PortName = "COM1";  //我假设端口为COM1
                serial1.DataBits = 8;
                serial1.Parity = System.IO.Ports.Parity.None;
                serial1.StopBits = System.IO.Ports.StopBits.One;
                serial1.Open();
            }
            else
            {
                serial1.Close();
            }
        }
以上是checkbox1复先框事件,主要是先打开端口及设置通讯参数。
 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (checkBox1.Checked == true)
                {
                    serial1.Write("d" + "/r/n"); //发送指令
double time= Microsoft.VisualBasic.DateAndTime.Now.TimeOfDay.TotalSeconds;
                    do
                    {
                        if (time + 10 < 
Microsoft.VisualBasic.DateAndTime.Now.TimeOfDay.TotalSeconds)
                        {
                            textBox1.Text = "通讯超时..";
                            return;
                        }
                    } while (serial1.BytesToRead < 47);
                    textBox1.Text = serial1.ReadExisting();   //把读取的字符串放到textbox1里去。
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
以上是button1点击事件,主要是发送串口控制指令并读取串口数据到textbox1里去。
这我是按照常规思路编程的串口通讯程序,在测试的时候,我打开端口后,点击Button1发送控制指令,成功获取了数据,但是一个情况:如果连接机器在我没有发送控制指令的时候进行了数据回传动作,我再点击Button1后接收终端(掌上电脑)就会卡住,需要等几分等后才有反应,而且有时候直接卡死没有反应了。我考虑到是不是数据阻塞所引起的这种现象。所以我在Button1事件里在发送指令之前进行清空缓冲数据操作,如下:
serial1.DiscardInBuffer();
serial1.DiscardOutBuffer();
serial1.Write("d" + "/r/n"); //发送指令
但是还不没有起作用,调试很长时候都不行,不知道问题出在哪里,可能你们会问,为什么不使用serial1的DataReceived事件进行自动接收数据呢,是这样的,DataReceived事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。

解决方案 »

  1.   

    但是还不没有起作用,调试很长时候都不行,不知道问题出在哪里,可能你们会问,为什么不使用serial1的DataReceived事件进行自动接收数据呢,是这样的,DataReceived事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。
    你所说的你需的时候再发,不就是指在不定时来取吗?那通过发送指令来获取。至于你卡死的原因,我认为你可以先用串口调试助手看一下。先确定问题。 
      

  2.   

    是这样子的,我这段程序是在掌上电脑(PDA)上运行的,如果这台掌上电脑的通过串口连接的是台式电脑的话,PDA好像又不存在卡死,但是是和全站仪连接的话,如果我通过发送控制指令后读取返回数据,不存在问题,但是如果全站仪主动发送数据到串口,我再发送控制指令获取数据,就会卡住很久或者卡死,我个人理解应该是数据阻塞的问题吧
      

  3.   

    想到一种可能,仅供参考,说的不对别拍哈~~~
    既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。
    只是一种想法,楼主可以在清空数据之前加个延时,保证发送端的数据发送完了,然后再清空缓存区的数据,如果这样有效的话,那就是上述的这种可能了。
      

  4.   

    我当时也想过这种数据阻塞的可能,所以我在测试的时候当仪器主动返回数据后,我并不急于发送控制指令,而等了一会,并且我Butto1事件之前加了
    serial1.DiscardInBuffer();
    serial1.DiscardOutBuffer();以清理缓存数据再进行后面的操作的
      

  5.   


    对啊,这是我完整的代码,就一个form1窗体,一个checkbox,一个button及一个接收数据用的textbox
    事件就是来面那两个事件