SerialPort类打开超过9串口问题

高手进来看看,SerialPort是不是有问题,出现不能打开超过9的串口,比如COM10就不行
进行跟踪调试发现在SerialPort的InitPort方法中,的CreateFile行返回的错误代码是INVALID_HANDLE_VALUE,我用MSCOMM和超级终端都能打开COM10,这是为什么?

CreateFile( 
"\\\\.\\COM10 ",//对应的就是\\.\COM10 
GENERIC_READ | GENERIC_WRITE, 
0, 
NULL, 
OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O 
NULL 

);


在做一个串口通讯,遇到了这个问题,com1到com9正常打开,com10以上就不行了,用getlasterror查看,错误位找不到指定文件,后查看MSDN,解释如下:

Windows NT: You can use paths longer than MAX_PATH characters by calling the wide (W) version of CreateFile and prepending "\\?\" to the path. The "\\?\" tells the function to turn off path parsing. This lets you use paths that are nearly 32,000 Unicode characters long. However, each component in the path cannot be more than MAX_PATH characters long. You must use fully-qualified paths with this technique. This also works with UNC names. The "\\?\" is ignored as part of the path. For example, "\\?\C:\myworld\private" is seen as "C:\myworld\private", and "\\?\UNC\tom_1\hotstuff\coolapps" is seen as "\\tom_1\hotstuff\coolapps". 

当路径长度大于MAX_PATH 后,应加上"\\?\",个人猜想,可能打开串口的话只能支持com1到com9,大于4个字符就不行了,故com10以上应添加"\\?\",即

CreateFile("\\\\?\\COM10", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

这样就能成功打开。以上方法所有com1~9也是可以的,所以建议就用这种方法吧。

后在网上看到说加"\\.\",试了一下也可以,和"\\?\"一样,我现在就在想“?”到底是什么意思,是不是换成其他符号也可以呢,后来试了,只有换成“."可以,关于这个问题还请高手解答。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,你需要按照以下步骤进行: 1. 打开串口并设置串口参数,包括波特率、数据位、停止位和校验位等; 2. 在串口接收事件中读取接收到的数据,并将其转换为数字格式; 3. 将数字数据存储到一个队列中,用于绘制曲线图; 4. 使用Chart控件绘制曲线图,将队列中的数据作为曲线的数据源。 下面是一个简单的代码示例,可以帮助你实现这个功能: ```csharp using System; using System.Collections.Generic; using System.IO.Ports; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace SerialPortChart { public partial class MainForm : Form { private SerialPort serialPort; private Queue<double> dataQueue = new Queue<double>(); public MainForm() { InitializeComponent(); // 初始化串口 serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.DataReceived += SerialPort_DataReceived; } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 读取串口数据并转换为数字格式 string data = serialPort.ReadExisting().Trim(); double value; if (double.TryParse(data, out value)) { // 将数字数据存储到队列中 dataQueue.Enqueue(value); } } private void btnOpen_Click(object sender, EventArgs e) { // 打开串口 serialPort.Open(); } private void btnClose_Click(object sender, EventArgs e) { // 关闭串口 serialPort.Close(); } private void timerChart_Tick(object sender, EventArgs e) { // 更新曲线图 if (dataQueue.Count > 0) { // 添加新数据点 double value = dataQueue.Dequeue(); chart.Series[0].Points.AddY(value); // 移除最早的数据点 if (chart.Series[0].Points.Count > 50) { chart.Series[0].Points.RemoveAt(0); } } } } } ``` 在这个示例中,我们使用了一个Timer控件来定时更新曲线图。每次定时器触发时,我们从队列中取出最新的数据,然后将其添加到曲线图中。如果曲线图中的数据点数量超过50个,我们会自动移除最早的数据点,以保证曲线图的显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值