我最近开发一个form程序,使用了serialPort控件,使用的是DataReceive事件的方式接收串口信息,但是现在我遇到了一个问题。如下:我按下主界面中的“联机”按钮,在其函数中我往串口发送一个联机信息,同时查询某一个标志位是否置1.比如
private int send_ok = -1;
private void toolStripButton_联机_Click(object sender, EventArgs e)
{
SendCommand((byte)0x1B, 12,ref send_ok );
}
private Error_Information SendCommand(byte Add, int Number,ref int sd_ok)
{
sd_ok = -1;
double spansecond = 0;
double m_waitrime = 50;
int send_count = 0;
do
{
if (SendCom(Add,Number))
{
TimeSpan span = new TimeSpan();
DateTime start_time = DateTime.Now; while ((spansecond <= m_waitrime) && (send_ok == -1))
{
span = DateTime.Now - start_time;
spansecond = span.TotalMilliseconds;
}
spansecond = 0;
}
else
{
MessageBox.Show("串口数据传输错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return Error_Information .RCC_ERROR_FAILDSEND;
}
if (sd_ok >= 0)
{
break;
}
send_count++;
} while (send_count < 1);
if (sd_ok < 0)
// 发送出错
{
MessageBox.Show("发送命令超过最大的次数", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return Error_Information .RCC_ERROR_FAILDSEND;
}
return Error_Information.RCC_ERROR_SUCCESS;
}
//将数据发送出去
public bool SendCom(byte Add, int Number)
{
transmitCommand[0] = (byte)0x01;
transmitCommand[1] = (byte)0xFF;
transmitCommand[2] = Add;
transmitCommand[11] = (byte)( transmitCommand[0] + transmitCommand[1] + transmitCommand[2] + transmitCommand[3] +
transmitCommand[4] + transmitCommand[5] + transmitCommand[6] + transmitCommand[7] +
transmitCommand[8] + transmitCommand[9] + transmitCommand[10]);
try
{
serialPort1.Write(transmitCommand, 0, Number);
while(send_ok == -1); }
catch
{
return false;
}
return true;
}
其中send_ok在DataReceive的事件程序中置1,但是现在的现象是一联机就死机了,停在了while(send_ok == -1);,我的问题是:DataReceive不是辅助线程吗?为什么不能把send_ok = 1;呢?我确定下位机肯定回传了联机成功的信息。请高手指教!
private int send_ok = -1;
private void toolStripButton_联机_Click(object sender, EventArgs e)
{
SendCommand((byte)0x1B, 12,ref send_ok );
}
private Error_Information SendCommand(byte Add, int Number,ref int sd_ok)
{
sd_ok = -1;
double spansecond = 0;
double m_waitrime = 50;
int send_count = 0;
do
{
if (SendCom(Add,Number))
{
TimeSpan span = new TimeSpan();
DateTime start_time = DateTime.Now; while ((spansecond <= m_waitrime) && (send_ok == -1))
{
span = DateTime.Now - start_time;
spansecond = span.TotalMilliseconds;
}
spansecond = 0;
}
else
{
MessageBox.Show("串口数据传输错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return Error_Information .RCC_ERROR_FAILDSEND;
}
if (sd_ok >= 0)
{
break;
}
send_count++;
} while (send_count < 1);
if (sd_ok < 0)
// 发送出错
{
MessageBox.Show("发送命令超过最大的次数", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return Error_Information .RCC_ERROR_FAILDSEND;
}
return Error_Information.RCC_ERROR_SUCCESS;
}
//将数据发送出去
public bool SendCom(byte Add, int Number)
{
transmitCommand[0] = (byte)0x01;
transmitCommand[1] = (byte)0xFF;
transmitCommand[2] = Add;
transmitCommand[11] = (byte)( transmitCommand[0] + transmitCommand[1] + transmitCommand[2] + transmitCommand[3] +
transmitCommand[4] + transmitCommand[5] + transmitCommand[6] + transmitCommand[7] +
transmitCommand[8] + transmitCommand[9] + transmitCommand[10]);
try
{
serialPort1.Write(transmitCommand, 0, Number);
while(send_ok == -1); }
catch
{
return false;
}
return true;
}
其中send_ok在DataReceive的事件程序中置1,但是现在的现象是一联机就死机了,停在了while(send_ok == -1);,我的问题是:DataReceive不是辅助线程吗?为什么不能把send_ok = 1;呢?我确定下位机肯定回传了联机成功的信息。请高手指教!
解决方案 »
- C++ 调用 C# COM Interop 报错
- 多条件模糊查询的问题,必须所有条件都写入才能查询成功,怎么解决啊?
- 关于Access数据库的还原与备份,重要的是和进度条能联动!C/S+100
- c# winform pictureBox如何同时在一个Form里显示多个视频
- 谈谈c#中的XML ajax
- 急 求一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾
- 高分求免费Outlook Toolbar
- c# 打印预览显示出一些文字,但是在打印时却不打印这些文字,是否可以?
- wcf rest post服务端无法接收数据
- 高分求救C# 实现 摄像头拍摄,类似Amcap
- .net2005 C#中TextBox的 AutoComplete功能不好用,高手赐教!
- 避免在一台机器上同时运行一应用程序的多个实例
//是否允许跨线程访问
// CheckForIllegalCrossThreadCalls = false;
程序中除了send_ok或sd_ok赋-1的地方,没看见哪个地方对它赋另外的值
所以while(send_ok == -1); 就一直死循环了
还有一部分代码,我没贴出来,send_ok = 1;在private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)中,代码太多,没贴出来。
{
span = DateTime.Now - start_time;
spansecond = span.TotalMilliseconds;
}
在这里面增加Thread.sleep(16)可能会好些while ((spansecond <= m_waitrime) && (send_ok == -1))
{
span = DateTime.Now - start_time;
spansecond = span.TotalMilliseconds;
Thread.sleep(16)
}
while(send_ok == -1);
改为:while(send_ok == -1)
Thread.Sleep(5);
试试。建议不要采用这种方式。
SendCmd后立即返回,同时采用一个线程来接受数据,并在一定的时间内进行判断,并使用代理返回一个联机是否成功的标识,然后在做。