Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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接收数据时检查设备状态 通过串行端口连接的设备的寿命状态。_C#_Serial Port_Status - Fatal编程技术网

C# 从串行端口c接收数据时检查设备状态 通过串行端口连接的设备的寿命状态。

C# 从串行端口c接收数据时检查设备状态 通过串行端口连接的设备的寿命状态。,c#,serial-port,status,C#,Serial Port,Status,大家好 如何检查设备是否响应请求?我在谷歌上搜索了几天,也尝试了很多解决方案,但都没有得到我预期的结果。经过多次尝试后,我的观点如下所述。我想我已经很接近了,但现在我不需要什么帮助,所以提前谢谢你的回答 现状 我现在做的很简单。首先,我要打开串口serialPort.Open在非常短的时间内打开应用程序数据,它接收几乎所有的应用程序运行时间 因为这只是我表单中的一个示例,所以只有一个标签称为labelStatus和labelStatus.Text=未连接 接下来,我将添加一个计时器和它的tick

大家好

如何检查设备是否响应请求?我在谷歌上搜索了几天,也尝试了很多解决方案,但都没有得到我预期的结果。经过多次尝试后,我的观点如下所述。我想我已经很接近了,但现在我不需要什么帮助,所以提前谢谢你的回答

现状 我现在做的很简单。首先,我要打开串口serialPort.Open在非常短的时间内打开应用程序数据,它接收几乎所有的应用程序运行时间

因为这只是我表单中的一个示例,所以只有一个标签称为labelStatus和labelStatus.Text=未连接

接下来,我将添加一个计时器和它的tick方法,其中包含serialPort.Write的execute。计时器间隔设置为100,如果这很重要的话

private void timer_Tick(object sender, EventArgs e)
{
    if (serialPort.IsOpen)
    {
        serialPort.WriteLine("r"); //I'm sending "r" message and device send data back
    }
}
下一步是创建DataReceived事件,如下面非常简化的版本,在我的应用程序中,接收到的数据正在解析为浮点并存储在数组中,但这只是为了说明问题

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string someVariable = serialPort.ReadLine();
    labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Connected"));
    //If i received something that means the device is plugged in and connection is correct (still very simplified)
}
最后一件事是创建ErrorReceived方法

直到现在一切都很好。发送数据是有效的。发送数据时,DataReceived事件每100毫秒执行一次。我的数据接收正确,没有问题。当我启动应用程序标签时,文本未连接设备电缆未插入。当我插入设备标签时,文本变为已连接。但现在,当我插入电缆时,ErrorReceived事件没有执行,labelStatus文本仍然连接。所以,正如我以前问过的:我如何检查设备是否仍然连接到计算机?或者:当数据未接收时,如何执行ErrorReceived事件

注意:串行端口读取超时设置为300毫秒

我试过什么 我试过很多东西,但我脑子里的这个似乎应该管用,但不行

我修改了DataReceived事件,并将serialPort.ReadLine放入带有TimeoutException的try/catch块中,在其中我尝试手动执行ErrorReceived方法,如下所示

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    try
    {
        string someVariable = serialPort.ReadLine();
        labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Connected"));
        //If i received something that means the device is plugged in and connection is correct (still very simplified)
    }
    catch (TimeoutException)
    {
        serialPort_ErrorReceived(null, null);
    }
}
我希望它能像我想的那样工作


顺便说一句,对不起我的英语。这并不完美,但我尽力了。干杯

收听在移除或插入设备时将触发的WM_DEVICECHANGE事件

下面是一个实现示例和一些详细信息:

USB样本 这就是我的解决方案 关于Martjin的回答,我需要进一步解释我的情况。首先,我想说的是,我没有在我的计算机上安装任何硬件,所以我认为WM_DEVICECHANGE事件不是我所需要的,但当然感谢您提供的信息,我学到了一些新东西。应用程序正在从天平读取数据。插入com端口后的Scale并没有发送任何数据,实际上它和计算机之间根本并没有通信。读取数据的唯一方法是向scale发送请求,因此我必须依赖于此

初试 该计划:

添加两个静态整型字段标志checkOld和checkNew, 增量checkNew-in-DataReceived,check-in-timer-Tick方法 is checkOld等于checkNew。如果为true,则表示选中New 不是增量,这意味着未执行DataReceived。 ` 私有void serialPort_DataReceivedobject发送方,System.IO.Ports.SerialDataReceivedEventArgs e {

`

该计划很好,但当我测试时,结果甚至不好。发生了什么?实际上设备状态是闪烁连接未连接未连接未连接等。我已写入一些数据以输出并获得答案。计时器循环太快,以至于DataReceived事件无法始终递增checkNew值

最终解决方案 根据目前的情况,我决定添加一些小改动。不要比较两个整数的值,而是尝试收集最后的两个值,并检查它们是否都是sem

该计划:

添加三个静态字段:前六个元素整数数组 statusArray,第二个整数索引,值等于最后的6 数组+1的元素,第三个整数checkNew, 增量签入 数据接收事件, 在要索引的计时器勾选事件填充数组中, 递减索引值直到填充整个数组,如果index==0,则将索引值重置为 6. 最后一次检查,如果最后六个checkNew值存储在 statusArray相同。如果为true,则表示DataReceived没有 连续执行六次,现在我可以确定连接是正确的 迷路的 ` 静态int指数=6; 静态int checkNew=0

static int[] statusArray = {0,0,0,0,0,0};

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{

    checkNew++;

    string someVariable = serialPort.ReadLine();
    labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Connected"));
    //If i received something that means the device is plugged in and connection is correct (still very simplified)
}

private void timer_Tick(object sender, EventArgs e)
{
    if (serialPort.IsOpen)
    {
        serialPort.WriteLine("r"); //I'm sending "r" message and device send data back
    }

    if (index == 0)
        index = 6;
    index--;

    int value = statusArray[index] = checkNew;
}

`

Hm.我试图发现这个想法,但我不确定WM_DEVICECHANGE event是否适合我的情况。我连接的设备是scale,我想系统不知道该设备是否连接。我实际上没有向我的计算机com端口或任何其他端口添加任何硬件,我不知道scale是否已插入,直到我刚刚安装结束数据并得到响应。但也许我错了。如果我不重新发送,Scale将不会发送任何信息
qest数据。如果我只是插上电子秤,它似乎只是插上电源,没有别的。公司之间没有通信。和设备。您在串行线路上使用握手吗?也许我没有正确理解,但握手似乎是解决你想要达到的目标的显而易见的方法?如果没有它,串行通信是无连接的
    checkNew++;

    string someVariable = serialPort.ReadLine();
    labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Connected"));
    //If i received something that means the device is plugged in and connection is correct (still very simplified)
}

private void timer_Tick(object sender, EventArgs e)
{
    if (serialPort.IsOpen)
    {
        serialPort.WriteLine("r"); //I'm sending "r" message and device send data back
    }
    if (checkOld == checkNew)
    {
        labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Not connected"));
    }
}
static int[] statusArray = {0,0,0,0,0,0};

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{

    checkNew++;

    string someVariable = serialPort.ReadLine();
    labelStatus.Invoke((MethodInvoker)(() => labelStatus.Text = "Connected"));
    //If i received something that means the device is plugged in and connection is correct (still very simplified)
}

private void timer_Tick(object sender, EventArgs e)
{
    if (serialPort.IsOpen)
    {
        serialPort.WriteLine("r"); //I'm sending "r" message and device send data back
    }

    if (index == 0)
        index = 6;
    index--;

    int value = statusArray[index] = checkNew;
}