- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C 程序,它打开一个 COM 端口的句柄,向它写入一些字节,读出一些字节,然后关闭句柄并退出。但是,当我连续运行程序 10 次时,开始需要很长时间才能完成 GetCommState
函数并卡在 SetCommState
中功能。同样的事情发生在 C# 中,一个简单的 SerialPort
对象。
我能找到的唯一解决方法是将设备重新连接到端口。有没有更优雅的方法来摆脱这种卡住?可能只是一些 PC 配置错误?
更新
我重写了代码以使其使用 DeviceIoControl
而不是 SetCommState
。但是,这里的问题完全相同。
device =
CreateFileW(
L"\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
static int SetBaudRate (HANDLE device) {
int error = 0;
int success = 0;
OVERLAPPED overlapped = {0};
overlapped.hEvent = CreateEvent(NULL, TRUE, 0, NULL);
if (overlapped.hEvent) {
SERIAL_BAUD_RATE baudRate = {0};
baudRate.BaudRate = SERIAL_BAUD_115200;
error =
DeviceIoControl(
device, IOCTL_SERIAL_SET_BAUD_RATE, &baudRate,
sizeof(SERIAL_BAUD_RATE), NULL, 0, NULL, &overlapped);
if (error || (!error && GetLastError() == ERROR_IO_PENDING)) {
DWORD bytes = 0;
if (GetOverlappedResult(device, &overlapped, &bytes, TRUE)) {
success = 1;
}
}
}
CloseHandle(overlapped.hEvent);
return success;
}
第一个问题:DeviceIoControl
没有立即返回(尽管是异步调用)并挂起大约两分钟。第二个问题:两分钟后它失败,错误代码为 121(ERR_SEM_TIMEOUT:“信号量超时期限已过期。”)。
usbser.sys
更新 2
也卡住的示例 C# 代码(如上面的 C 程序):
using System;
using System.IO.Ports;
sealed class Program {
static void Main (string[] args) {
int i = 0;
while (true) {
Console.WriteLine(++i);
SerialPort p =
new SerialPort("com3", 115200, Parity.None, 8, StopBits.One);
p.DtrEnable = true;
p.RtsEnable = true;
p.ParityReplace = 0;
p.WriteTimeout = 10000;
p.ReadTimeout = 3000;
try {
p.Open();
Console.WriteLine("Success!");
} catch (Exception e) {
Console.WriteLine(e.GetType().Name + ": " + e.Message);
}
p.Close();
Console.ReadLine();
}
}
}
示例输出如下:
1 (device not yet connected)
IOException: The port 'com3' does not exist.
2 (device connected but not yet in windows device manager)
IOException: The port 'com3' does not exist.
3
IOException: The port 'com3' does not exist.
4 (device connected and recognized)
Success!
5
Success!
[...] (with about one second between each enter press)
15
Success!
16 (device still connected and recognized - nothing touched! after two minutes of freeze, semaphore timeout exactly as in the C version)
IOException: The semaphore timeout period has expired.
17 (device disconnected during the two minutes of freeze. it then returns instantly)
IOException: A device attached to the system is not functioning.
18 (device still disconnected - note that the exception is a different one than the one in the beginning although it's the same case: device not connected)
IOException: The specified port does not exist.
19
IOException: The port 'com3' does not exist.
最佳答案
这是我的 c++ 类的一个工作部分,用于处理串行端口通信,稍作更改以适应 C
和您的需求。如果它不起作用,则可能是您的虚拟端口驱动程序有问题
DCB SerialPortSettings;
HANDLE SerialPort;
int OpenPort(WCHAR* PortName,int BaudRate)
{
SerialPort = CreateFileW(PortName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(SerialPort==INVALID_HANDLE_VALUE)
return -2;
RtlZeroMemory(&SerialPortSettings,sizeof(DCB));
SerialPortSettings.DCBlength = sizeof(DCB);
if(!GetCommState(SerialPort,&SerialPortSettings))
{
CloseHandle(SerialPort);
return -3;
}
//8n1 RS485
SerialPortSettings.BaudRate = BaudRate;
SerialPortSettings.ByteSize = 8;
SerialPortSettings.Parity = NOPARITY;
SerialPortSettings.StopBits = ONESTOPBIT;
SerialPortSettings.fRtsControl = RTS_CONTROL_TOGGLE;
if(!SetCommState(SerialPort,&SerialPortSettings))
{
CloseHandle(SerialPort);
return -4;
}
return 0;
}
编辑:尝试从 http://www.ftdichip.com/Drivers/VCP.htm 下载驱动程序,因为您描述的问题很可能是驱动程序或设备问题。为 Etan 工作 :)
关于c# - 使用 usbser.sys 在 SerialPort.Open/DeviceIoControl/GetcommState 上卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6749681/
我们在用户模式下有 OverLapped 结构。例如我们可以调用 DeviceIoControl与重叠的成员在完成此调用时引发事件。但是什么内核模式?如何通过回调在内核中发送异步 DeviceIoCo
我在使用 DeviceIOControl 时遇到一些问题。我正在尝试从物理驱动器读取磁盘几何结构,但从未设置输出缓冲区。 这是我的代码示例,一个简单的函数,应该获取磁盘几何形状并返回磁盘是否可移动:
我正在尝试将 INOUT_PARAM 发送到我的内核驱动程序,看来我已经成功了。当我尝试编辑它并将其发送回应用程序时,我收到以下错误: 这是应用程序代码: typedef struct _INOUT_
我正在尝试在我的硬盘上进行分区偏移。我这样做: PDRIVE_LAYOUT_INFORMATION_EX partitions; DWORD partitionsSize = sizeof(DRIVE
当我运行以下代码时,我对内存位置的访问无效 WIN32_FIND_DATAW FD; WCHAR cPath[MAX_PATH], cFindPath[MAX_PATH]; if (!GetCurre
我正在为它写一个 Windows CE 服务和一个 API 库,它包装了 DeviceIoControl与图书馆沟通所需的电话。我可以确定,传递给 DeviceIoControl 函数的内存缓冲区编码
我正在尝试将一些数据从我的内核驱动程序传递到用户应用程序。 我已经在驱动程序和应用程序共享的头文件中定义了结构: typedef struct _CallBack { HANDLE
我使用 DeviceIoControl 返回物理磁盘扇区的大小。它总是返回 512 个字节,直到最近它开始返回 4096 个字节。检查生成的 STORAGE_ACCESS_ALIGNMENT_DESC
我正在尝试与用于创建 TUN 接口(interface) (WinTun) 的驱动程序交互,但为了从它们发送和接收数据,我需要注册一个环形缓冲区。我正在使用的代码看起来像这样(我省略了使用 Setup
我正在尝试理解和使用 win32file。我需要获取 USN 期刊,并且很难理解我在网上找到的代码片段。这是我找到的代码片段 - format = 'qqqqqLLLLqqqqq' length =
我正在尝试调用 DeviceIoControl(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) API,作为 shown here ,但我需要它首先“告诉我”它需要多少内存
我可以向应用程序发送数据驱动程序。 在应用中: DeviceIoControl(dHandle, IOCTL_TEST, (PVOID)InputBuffer, sizeof(InputBuffer)
在回答我的问题之前,我将回顾一下我目前正在使用的东西,以便您对我已经做过/尝试过的事情有一个很好的了解。 我有一个多线程用户模式 Windows 桌面应用程序,它向 KMDF 驱动程序发出 Dev
我正在使用 DeviceIoControl 开发 C# 项目.我咨询过相关Pinvoke.net page我的签名: [DllImport("Kernel32.dll", SetLastError =
根据我的理解,DeviceIOControl和ioctl是相同的功能。它们都向硬件发送控制代码并返回响应。为了重用代码,我尝试创建一个能够以跨平台方式工作的函数。因此,我决定使用 DeviceIOCo
我尝试使用 DeviceIoControl 函数(Win32 API 函数)弹出我的 CDROM 驱动器,当我的 CDROM 驱动器没有磁盘时它工作正常,但是在插入磁盘后,Marshal .GetLa
我的操作系统是 Win7 64 位。我正在尝试通过 DeviceIoControl 将变量的值而不是它的地址(进程 ID,DWORD)传递给我的驱动程序。试了好几次,都是蓝屏或者错误码998。 在用户
我在使用 DeviceIOControl 将 128 字节缓冲区放入我的驱动程序时遇到问题,我使用此代码: int Initialize(unsigned char* public_signature
此代码在 Windows 7 上启动时完全没问题: HANDLE hVol = CreateFile(L"\\\\.\\c:", GENERIC_WRITE | GENERIC_READ,
我正在尝试通过 DeviceIOControl 初始化磁盘并创建 NTFS 分区,而不使用 DiskPart 或 WMI。 使用下面的代码我可以初始化磁盘并创建一个 RAW 分区,但我无法调整参数以使
我是一名优秀的程序员,十分优秀!