我在进行串口通讯测试时遇到一个问题,求高手帮助我一下,问题如下:
首先我新建一个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事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。
首先我新建一个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事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。
你所说的你需的时候再发,不就是指在不定时来取吗?那通过发送指令来获取。至于你卡死的原因,我认为你可以先用串口调试助手看一下。先确定问题。
既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。
只是一种想法,楼主可以在清空数据之前加个延时,保证发送端的数据发送完了,然后再清空缓存区的数据,如果这样有效的话,那就是上述的这种可能了。
serial1.DiscardInBuffer();
serial1.DiscardOutBuffer();以清理缓存数据再进行后面的操作的
对啊,这是我完整的代码,就一个form1窗体,一个checkbox,一个button及一个接收数据用的textbox
事件就是来面那两个事件