先说一下,下位机用的CH341 USB转串口芯片,现在要实现自动查找这个COM口,方法是从COM1开始依次打开每个串口,如果打开串口失败则跳过(串口不存在或正在使用),如果打开成功则设置该串口波特率为300,然后向该串口写入ASCII字符串"$CH341Ser?",如果该串口是普通串口,那么通常没有任何返回,如果该串口是CH341串口,那么应用程序将能接收到一个ASCII字符"W",以此识别CH341。
然后问题来了,我现在有三个COM,COM1,COM2,COM3,其中COM3是CH341下位机的,我只要一向COM3发送"$CH341Ser?"就发送超时,其他口没有问题,向COM3发送其他字符也可以,比如"$CH341Ser"或"CH341Ser?"之类的都可以,就是发送"$CH341Ser?"就会显示发送超时,我用别人的串口助手可以收到返回的‘W’,自己用C++写的也可以,不知道有没有人懂,先谢谢各位
代码: //扫描CH341
private void buttonSearchPort_Click(object sender, EventArgs e)
{
if (comm.IsOpen)
comm.Close();
string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);
foreach (string num in ports)
{
comm.PortName = num;
comm.BaudRate = 300;
comm.Open();
byte[] buf = Encoding.ASCII.GetBytes("$CH341Ser?");
comm.Write(buf, 0, buf.Count());
//System.Threading.Thread.Sleep(300);
int n = comm.BytesToRead;
if (n > 0)
{
//这边处理一下接收的
MessageBox.Show("成功");
}
else
{
if (comm.IsOpen)
comm.Close();
}
}
}
然后问题来了,我现在有三个COM,COM1,COM2,COM3,其中COM3是CH341下位机的,我只要一向COM3发送"$CH341Ser?"就发送超时,其他口没有问题,向COM3发送其他字符也可以,比如"$CH341Ser"或"CH341Ser?"之类的都可以,就是发送"$CH341Ser?"就会显示发送超时,我用别人的串口助手可以收到返回的‘W’,自己用C++写的也可以,不知道有没有人懂,先谢谢各位
代码: //扫描CH341
private void buttonSearchPort_Click(object sender, EventArgs e)
{
if (comm.IsOpen)
comm.Close();
string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);
foreach (string num in ports)
{
comm.PortName = num;
comm.BaudRate = 300;
comm.Open();
byte[] buf = Encoding.ASCII.GetBytes("$CH341Ser?");
comm.Write(buf, 0, buf.Count());
//System.Threading.Thread.Sleep(300);
int n = comm.BytesToRead;
if (n > 0)
{
//这边处理一下接收的
MessageBox.Show("成功");
}
else
{
if (comm.IsOpen)
comm.Close();
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货