关于串口通讯编程遇到的一个问题,求助高手指点

yhj8848 2012-12-06 01:43:23
我在进行串口通讯测试时遇到一个问题,求高手帮助我一下,问题如下:
首先我新建一个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事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。
...全文
234 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
引用 12 楼 leafmao 的回复:
那我就不懂啦╮(╯▽╰)╭ 这是你完整的代码吗,把完整的贴出来让大家帮忙找找问题原因吧
引用 13 楼 wl0326 的回复:
楼上正解。。。。
对啊,这是我完整的代码,就一个form1窗体,一个checkbox,一个button及一个接收数据用的textbox 事件就是来面那两个事件
wl0326 2012-12-06
  • 打赏
  • 举报
回复
楼上正解。。。。
leafmao 2012-12-06
  • 打赏
  • 举报
回复
那我就不懂啦╮(╯▽╰)╭ 这是你完整的代码吗,把完整的贴出来让大家帮忙找找问题原因吧
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
引用 9 楼 leafmao 的回复:
引用 8 楼 yhj8848 的回复: 引用 7 楼 leafmao 的回复:想到一种可能,仅供参考,说的不对别拍哈~~~ 既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。 只是一种想法……
双工,一般我发送指令后到返回数据,一秒左右吧。上次仪器主动返回数据到串口,我等了几分钟后才操作的,呵呵,应该不会是时间的问题
leafmao 2012-12-06
  • 打赏
  • 举报
回复
弱弱问句,楼主接线是怎么接的。 串口上有接收孔和发送孔,数据不是在一根线上,不存在接收和发送冲突的问题。 如果是单工,只有一根收发线的话,是存在数据阻塞的问题的。
leafmao 2012-12-06
  • 打赏
  • 举报
回复
引用 8 楼 yhj8848 的回复:
引用 7 楼 leafmao 的回复:想到一种可能,仅供参考,说的不对别拍哈~~~ 既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。 只是一种想法,楼主可以在清空……
仪器返回数据要多长时间呀?多等几秒试试,等个15秒的应该差不多了。 我的想法是,清空了缓存区数据后又进来了新的数据,造成总线一直被占用。 顺便问下,你用的是双工的还是单工的?
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 leafmao 的回复:
想到一种可能,仅供参考,说的不对别拍哈~~~ 既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。 只是一种想法,楼主可以在清空数据之前加个延时,保证发送端的数据发送完了,然后再清空缓存区的数……
我当时也想过这种数据阻塞的可能,所以我在测试的时候当仪器主动返回数据后,我并不急于发送控制指令,而等了一会,并且我Butto1事件之前加了 serial1.DiscardInBuffer(); serial1.DiscardOutBuffer();以清理缓存数据再进行后面的操作的
leafmao 2012-12-06
  • 打赏
  • 举报
回复
想到一种可能,仅供参考,说的不对别拍哈~~~ 既然用串口助手调试没问题,可能问题出在接线上,会不会楼主用的是单工的通信。在发送端提前发送的时候,按下button1,这时总线上是来自发送端的数据,但是掌上电脑又需要发送数据,清空完数据后,对方还是有数据过来,新过来的数据并没有得到清空,这时就发生冲突了。 只是一种想法,楼主可以在清空数据之前加个延时,保证发送端的数据发送完了,然后再清空缓存区的数据,如果这样有效的话,那就是上述的这种可能了。
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
是这样子的,我这段程序是在掌上电脑(PDA)上运行的,如果这台掌上电脑的通过串口连接的是台式电脑的话,PDA好像又不存在卡死,但是是和全站仪连接的话,如果我通过发送控制指令后读取返回数据,不存在问题,但是如果全站仪主动发送数据到串口,我再发送控制指令获取数据,就会卡住很久或者卡死,我个人理解应该是数据阻塞的问题吧
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
引用 1 楼 libinguest 的回复:
但是还不没有起作用,调试很长时候都不行,不知道问题出在哪里,可能你们会问,为什么不使用serial1的DataReceived事件进行自动接收数据呢,是这样的,DataReceived事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。 你所说的你需的时候再发,不就是指在不定时来取吗?那通过发送指令来……
我用串口调试过,却不存在卡死的问题
浪子-无悔 2012-12-06
  • 打赏
  • 举报
回复
你的程序是签入到终端设备上的啊?楼上的建议很好,可有先在本地的串口调试器上测试看看数据的读取是否会反应迟钝。一般都是因为你串口本身通讯不正常才造成的反应慢甚至超时的。。。
yhj8848 2012-12-06
  • 打赏
  • 举报
回复
引用 2 楼 leafmao 的回复:
接收终端(掌上电脑)是指的哪个?是用你这个程序的,还是给你这个程序发送数据的另一端(连接器?)?
是用我这个程序的
leafmao 2012-12-06
  • 打赏
  • 举报
回复
接收终端(掌上电脑)是指的哪个?是用你这个程序的,还是给你这个程序发送数据的另一端(连接器?)?
风之影子 2012-12-06
  • 打赏
  • 举报
回复
但是还不没有起作用,调试很长时候都不行,不知道问题出在哪里,可能你们会问,为什么不使用serial1的DataReceived事件进行自动接收数据呢,是这样的,DataReceived事件是挺好的,但是我不须要实时的传输数据,而是在我需要的时候,用发送控制指令的时候获取数据,仅此而已。以上的问题,求哪位大神能帮忙解决一下。 你所说的你需的时候再发,不就是指在不定时来取吗?那通过发送指令来获取。至于你卡死的原因,我认为你可以先用串口调试助手看一下。先确定问题。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧