首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#信号量超时期在写入虚拟串口时已过期。

C#信号量超时期在写入虚拟串口时已过期。
EN

Stack Overflow用户
提问于 2017-01-08 13:07:40
回答 1查看 4K关注 0票数 1

我正在尝试与使用CDC的USB设备进行通信。设备连接在设备管理器中被视为串行端口。我看到了设备并能打开串口。然而,当我试图向设备发送消息时,System.IO.IOException会被抛出,上面写着:“信号量超时期已经过期。”与几个第三方C#串口终端得到了相同的异常。

使用与USB- to 232转换器相同的程序,我可以用串口与另一个设备(而不是CDC)通信。

CDC设备制造商说他们的模块使用标准的Windows驱动程序,所以问题就在我的头上。我做错了什么?

我的代码:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace ConsoleApplication1
{
    class Program
    {
        private static readonly SerialPort _serial = new SerialPort();
        static void Main(string[] args)
        {
            var portList = SerialPort.GetPortNames().ToList();
            _serial.PortName = portList[0]; 
            _serial.BaudRate = 9600;
            _serial.Handshake = Handshake.None;
            _serial.Parity = Parity.None;
            _serial.DataBits = 8;
            _serial.StopBits = StopBits.Two;
            _serial.ReadTimeout = 3000;
            _serial.WriteTimeout = 3000;
            _serial.DataReceived += ReceiveData;
            _serial.Open();

            while (true)
            {
                string str = Console.ReadLine();

                if (str.Equals("exit"))
                    return;
                SerialCmdSend(str);
            }

        }

        public static void SerialCmdSend(string data)
        {
            if (_serial.IsOpen)
            {
                try
                {
                    byte[] hexstring = Encoding.ASCII.GetBytes(data);
                    foreach (byte hexval in hexstring)
                    {
                        byte[] _hexval = { hexval }; 
    //The exception is thrown 3 sec. after the first call of the Write function
                        _serial.Write(_hexval, 0, 1); 
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
            }
        }


        private static void ReceiveData(object sender, SerialDataReceivedEventArgs e)
        {
            if (!_serial.IsOpen)
            {
                return;
            }
            try
            {
                while (_serial.BytesToRead > 0)
                {
                    var b = _serial.ReadChar();
                    //Handle read data
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-01-11 16:21:16

在完全配置连接之前,您的USB设备可能正在检查是否启用了DTR (数据终端就绪)。我建议在打开comport之前将以下代码添加到您的c#程序中。

代码语言:javascript
运行
复制
_serial.DtrEnable = true;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41533030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档