- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前在我的大学里,我们正在这些旧的 56k 调制解调器之间进行通信。当从 PC 到调制解调器的消息通过串行端口时,我想使用 System.IO.Ports.SerialPort .NET 类。
我编写了相当大的 C# 应用程序来与调制解调器通信,拨号到其他调制解调器并通过它们进行通信。一切正常,直到我设法在两个调制解调器之间建立连接。发生这种情况时,两个调制解调器(应该是)从 COMMAND 模式(我可以将 Hayes 的命令发送到调制解调器)切换到 DATA 模式(我发送到调制解调器的所有数据都被转发到另一个调制解调器)。
我的应用程序可以向串口发送东西,也可以从串口接收东西。它安装在两台连接的 PC 上。但是当我在我的应用程序中输入一些东西时,例如“喂”,对方没有收到。奇怪的部分来了。下面是我如何通过串行端口发送消息(“端口”是 SerialPort 类的一个实例,“数据”是一个字符串的实例):
port.Write(data);
这样就可以了。它必须工作。特别是,因为如果我使用我的应用程序在一侧发送而 PuTTy 在另一侧接收 - 它有效!连接到有效串行端口的 PuTTy 收到我的消息。这也意味着,不仅我的消息到达了第一个调制解调器;它正在通过网络发送到另一个调制解调器,然后另一个调制解调器通过串行端口将它发送到接收PC。但这还不是全部。当我使用我的应用程序接收时,我使用 SerialPort.DataReceived 事件,就像这样(当然方法已经被 +=ed 到事件处理程序):
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//this message box should pop up if event hit:
MessageBox.Show("Data from serial port received!");
//calling my method to handle incoming message
DataReceived((SerialPort)sender);
}
当调制解调器(连接到接收 PC 的调制解调器)处于命令模式时,它可以工作。例如。当我向调制解调器发送“AT”Hayes 的命令时(仅表示“ping”),调制解调器响应“OK”,我收到了它。 SerialPort.DataReceived 事件触发。但是当这个调制解调器处于数据模式时(当我不能向它发送 Hayes 的命令时),它从发送调制解调器接收到一条消息,并将它转发到串行端口 - 没有。事件甚至没有触发。我检查的很好。
这很奇怪!
这只能让我得出结论,调制解调器向串行端口发送消息的方式在数据模式和命令模式下略有不同,PuTTy 以某种方式理解其他方式,而 SerialPort 类不.
我真的不明白。
最佳答案
你说当调制解调器处于命令模式时 DataReceived 事件不会触发,作为在串口/调制解调器通信方面有个人经验的人,我敢说当你从串口收集数据时你正在做一些阻塞操作。
到目前为止,我已经完成了几个使用 SerialPort 类的项目来处理使用 .NET40 的调制解调器通信,并且通信按预期进行。
我最好的猜测是您的方法 DataReceived((SerialPort)sender); 正在阻止进一步接收数据。
我为了在从锁中的端口收集接收到的数据时避免死锁,但在锁外处理它们并确保处理完成某些事情(不要做任何冗长的事情,否则它会挂起接收), 比如:
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var com = sender as SerialPort;
var lst = new List<byte>();
if (com != null)
{
lock (com)
{
do
{
if (com.BytesToRead == 0) break;
var one = com.ReadByte();
if (one >= 0 && one < 256) lst.Add(Convert.ToByte(one));
} while (one >= 0 && one < 256);
// lst.ToArray(); // get bytes
}
// ... // do something with received data
}
}
您没有提供有关数据处理的详细信息,所以我只能猜测该代码中有某种 block 。
在提供的样本中有两个要点:
此外,提供的代码(以类似的形式)总是在多线程应用程序中使用,因此 Main 上的 [MTAThread] 属性!
排除串行通信故障的最快方法之一可能是安装com0com,虚拟串口来自 http://com0com.sourceforge.net/并尝试不使用调制解调器直接通信,只是为了确保数据交换有效。
其实你可以在你的应用程序中使用它。只需安装一对虚拟 com 端口,将您的应用程序附加到一个串行端口,将 putty 附加到其他串行端口,当您在 putty 上看到 ATZ 时,只需响应 OK\r\n :)但是,如果您使用的是引脚读数,那么 putty 就帮不了您了,至少我不知道如何从 putty 更改标志。
我知道这个帖子有点旧,但欢迎提供一些反馈。
快乐编码。
关于c# - 为什么 System.IO.Ports.SerialPort.DataReceived 事件在调制解调器处于数据模式时不触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857410/
我正在尝试在 IN sql 条件下使用数据库字段。我的字段是一串由逗号分隔的值(如 it,en,fr,de),我必须在 WHERE 子句中使用它,如下所示: WHERE d.iso639code =
他大家 我的以下代码有问题: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp e
在处理 ReadOnlyMany 存储时,我正在努力理解 PersistentVolume 上的容量参数的概念,以及 PersistentVolumeClaim 上的存储请求。如果存储以只读方式安装
我试图让一个 while 循环在另一个 while 循环中工作,我之前已经让它工作过,但无法再次管理它。 我试图计算航类查询中的总记录,然后在小时记录中尝试添加时间。我已经让所有查询单独工作,但是当我
我们的数据库更新性能偶尔会大幅下降。 例如,表 FooTable 我们有大约 40 列与 varchar PK 此外还有 10 个索引。以下查询用时 44 秒,而在其他时候它几乎立即运行。在减速期间,
我可以在 Release模式下使用 Trace.WriteLine 吗? Trace.Write 和 Debug.Write 之间的主要区别是什么? 最佳答案 不同之处在于 Release模式。 当未
我刚刚遇到了一个非常奇怪的场景,并且在其他地方找不到任何相关信息。当 Xcode 在我的断点处中断时,整个系统的所有键盘输入都没有响应。我可以切换到另一个应用程序,但没有记录任何击键。 Xcode 本
我一直在尝试在一组 Raspberry Pi 上设置 K8s 集群。这是我的 GitHub 页面的链接,描述了整个设置: https://github.com/joesan/plant-infra/b
我的 pod 处于 Pending 状态,因为提到的所有答案我都试图获得描述输出但不知道为什么它保持在 Pending 状态: k8s@k8s-master:~/deployment$ kubectl
我已经开发了一个非消耗性的应用内购买iOS应用程序。我已经获取了应用内购买的 bundle 包标识符,并编写了代码并将其提交给appstore ...提交应用程序后,其状态显示在-App Purcha
我有 2 个具有一对多关系的实体,一个地址可以是多个员工。 MySQL 数据库: 地址 address_id INT PK AutoIncr 城市 VARCHAR 国家/地区 VARCHAR 员工 i
我想在我的项目中使用 ProGuard。我激活了选项 minifyEnabled。当我打开使用库 Retrofit2 的 Activity 时,应用程序崩溃并显示: 无法为接口(interface)
我刚刚在 MVC 应用程序中启用了 Application Insights,并注意到在本地调试时,我的 Azure Application Insight 中会捕获跟踪信息。 处于 Debug模式时
我正在使用一个启动和结束线程的类。线程是在构造函数中创建的。只要标志为 TRUE,线程函数就会继续循环。该标志是该类的静态成员。解构器将标志设置为 FALSE。这样,该类的每个实例都有一个关联的线程,
我有一个 Angular PWA。在我从 Angular 5.0 升级到 7.2 之前,它的 service worker 工作完美 升级后,我在/ngsw/state中看到以下错误 Driver s
可能有一些背景:当用户单击它时,我试图在可滚动的全屏 EditText 上方显示一个特定的键盘 View 。问题是如果光标位于 EditText 的底部,它会被弹出的键盘 View 隐藏。 与常规 I
当进度条处于 Activity 状态时禁用后台交互的正确方法是什么。 Box( modifier = Modifier.fillMaxSize(), contentAlignmen
这个问题在这里已经有了答案: Draw Rectangle inside picture box SizeMode Zoom (1 个回答) 关闭 3 年前。 我有一个 PictureBox1,其
我们刚刚开始在 kubernetes 上创建我们的集群。 现在我们尝试部署分蘖,但出现错误: NetworkPlugin cni failed to set up pod "tiller-deploy
我使用 NRPE 插件将一台 Linux 主机配置为 Nagios 监控服务器。 为此,我遵循以下 URL http://www.tecmint.com/how-to-add-linux-host-t
我是一名优秀的程序员,十分优秀!