C# 多个串行端口读取仅在几分钟后挂起
我试图写一些代码,同时从两个串行端口读取数据 我成功地做到了这一点;但是,在运行应用程序几分钟后,它会挂断 我需要它运行至少一个小时来记录足够的数据点。如果有人看一下我的代码,如果他们发现任何问题,请告诉我,我将不胜感激C# 多个串行端口读取仅在几分钟后挂起,c#,.net,serial-port,C#,.net,Serial Port,我试图写一些代码,同时从两个串行端口读取数据 我成功地做到了这一点;但是,在运行应用程序几分钟后,它会挂断 我需要它运行至少一个小时来记录足够的数据点。如果有人看一下我的代码,如果他们发现任何问题,请告诉我,我将不胜感激 // Timer to get the data every half a second. private void timer1_Tick(object sender, EventArgs e) { if (!Torque_serialport.IsOpen)
// Timer to get the data every half a second.
private void timer1_Tick(object sender, EventArgs e)
{
if (!Torque_serialport.IsOpen)
{
Torque_serialport.PortName = Torque_com_name;
Torque_serialport.BaudRate = Torque_baud_rate;
Torque_serialport.DataBits = Convert.ToInt32(Torque_data_bits);
Torque_serialport.Parity = Parity.None;
Torque_serialport.StopBits = StopBits.One;
Torque_serialport.Handshake = Handshake.XOnXOff;
}
if (!Torque_serialport.IsOpen) { Torque_serialport.Open(); }
// * Initializing Temperature Sensor and Checking Whether its Open or Not. If open, nothing is done. If close, open it.
if (!Temp_serialport.IsOpen)
{
Temp_serialport.PortName = Temp_com_name;
Temp_serialport.BaudRate = Temp_baud_rate;
Temp_serialport.DataBits = Convert.ToInt32(Temp_data_bits);
Temp_serialport.Parity = Parity.None;
Temp_serialport.StopBits = StopBits.One;
Temp_serialport.Handshake = Handshake.None;
}
if (!Temp_serialport.IsOpen) { Temp_serialport.Open(); }
Read_Data();
}
读取数据功能,其中数据读取发生:
public void Read_Data()
{
// * Tell Torque Readout Device to switch to Instantaneous Readings Mode (sending S0)
byte[] Send_S0 = { 0x53, 0x30, 0x0D };
Torque_serialport.Write(Send_S0, 0, 3);
// * Initializing Reading Buffer and Necessary Variables for Storing Read Values.
byte[] read_buffer = new byte[8];
int bytesread = 0;
int offset = 0;
double Torque_Reading;
double Temp_Reading;
string Temp_reading_string;
DateTime Time_Stamp;
//int Grid_row_index = 0;
byte[] Send_Xon = { 0x11, 0x0D };
byte[] Send_Xoff = { 0x13, 0x0D };
byte[] Send_TempStart = { 0x3F, 0x54, 0x0D };
string[] Tabular_Data = new string[] { "", "", "" };
Torque_serialport.Write(Send_Xon, 0, 2);
while (offset < 8)
{
bytesread = Torque_serialport.Read(read_buffer, offset, 8 - offset);
offset = offset + bytesread;
if (read_buffer[7] == 0x0A)
{
Torque_serialport.Write(Send_Xoff, 0, 2);
offset = 0;
break;
}
}
Time_Stamp = DateTime.Now;
Temp_serialport.Write(Send_TempStart, 0, 3);
Temp_reading_string = Temp_serialport.ReadExisting();
if (Temp_reading_string != "")
{
Temp_Reading = double.Parse(Temp_reading_string.Substring(2, 6));
Torque_Reading = Calculate_Torque(read_buffer);
}
// Reset Variables
offset = 0;
for (int k = 0; k < 8; k++)
{
read_buffer[k] = 0;
}
// Delay System by 1 Seconds.
System.Threading.Thread.Sleep(1000);
this.Refresh();
}
public void Read_Data()
{
//*告知扭矩读数装置切换到瞬时读数模式(发送S0)
字节[]Send_S0={0x53,0x30,0x0D};
扭矩串行端口写入(发送S0,0,3);
//*初始化读取缓冲区和存储读取值所需的变量。
字节[]读取缓冲区=新字节[8];
int字节读取=0;
整数偏移=0;
双扭矩读数;
双温读数;
字符串温度读取字符串;
日期时间戳;
//int Grid_row_index=0;
字节[]Send_Xon={0x11,0x0D};
字节[]Send_Xoff={0x13,0x0D};
字节[]Send_TempStart={0x3F,0x54,0x0D};
string[]Tabular_Data=新字符串[]{”“,”“};
Torque_serialport.Write(发送Xon,0,2);
while(偏移量<8)
{
bytesread=扭矩_串行端口.Read(读取缓冲区,偏移量,8-偏移量);
偏移量=偏移量+字节读取;
if(读取缓冲区[7]==0x0A)
{
Torque_serialport.Write(发送_Xoff,0,2);
偏移量=0;
打破
}
}
时间戳=日期时间。现在;
Temp_serialport.Write(发送TempStart,0,3);
Temp_reading_string=Temp_serialport.ReadExisting();
如果(临时读取字符串!=“”)
{
Temp_Reading=double.Parse(Temp_Reading_string.Substring(2,6));
扭矩读数=计算扭矩(读取缓冲);
}
//重置变量
偏移量=0;
对于(int k=0;k<8;k++)
{
读取缓冲区[k]=0;
}
//将系统延迟1秒。
系统线程线程睡眠(1000);
这个。刷新();
}
提前非常感谢您的帮助。您实际上是在使用定时器滴答功能睡觉。坏主意 还不清楚您在
this.Refresh()中做了什么。根据您设置计时器的方式,如果您想继续计时,可能需要也可能不需要告知计时器(显然,您会得到多个数据点(?)
在Visual Studio中,有一种功能可以让断点在被击中时执行不同的操作。因此,在勾选函数中放置一个断点,然后在断点的红色球上单击鼠标右键。浏览上下文菜单,尤其是“击中时”->打印消息。感谢所有对此问题做出贡献的人。我找到了答案。
事实上,两个串行端口在运行几分钟后会超时,所以我所要做的就是设置读/写超时,并处理抛出的异常。它曾经挂起,因为它要么等待写入,要么无限期地从串行端口读取某些内容
无论如何,我希望这个简单的错误能够帮助其他人,再次感谢您的贡献。尝试使用portmon查看发送的数据。失败是因为设备停止发送数据还是应用程序中的某些内容。还有,为什么您使用计时器,然后还睡在该线程中?谢谢您的评论。我已经运行了e每个传感器本身都使用制造商提供的软件,一切正常。山姆,谢谢你的评论。我会试试你说的,希望能弄清楚发生了什么。