Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个串行端口读取仅在几分钟后挂起_C#_.net_Serial Port - Fatal编程技术网

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每个传感器本身都使用制造商提供的软件,一切正常。山姆,谢谢你的评论。我会试试你说的,希望能弄清楚发生了什么。