【问题标题】:Send AT command to a CDC reader and get response向 CDC 阅读器发送 AT 命令并获得响应
【发布时间】:2020-08-13 09:58:56
【问题描述】:

我有这个 CDC 非接触式阅读器,它与显示为虚拟串行端口的 USB 连接。我可以使用以下代码找到端口并发送 AT 命令:

string strPort = GetPortName();

SerialPort srPort = new SerialPort(strPort, 9600);

srPort.Open();

if (srPort.IsOpen)
{
    //device info
    srPort.WriteLine(@"ATI\r" + (char)(13));
    System.Threading.Thread.Sleep(200);

    MessageBox.Show("Device: " + srPort.ReadExisting());

    //card UID
    srPort.WriteLine(@"AT+i\r" + (char)(13));
    System.Threading.Thread.Sleep(200);

    string strRes = srPort.ReadExisting();

    MessageBox.Show("UID: " + strRes);

    srPort.Close();
}

我正在根据device documentation 发送命令。第一个命令正常,但第二个,应该给我卡 UID 总是返回 ERROR

我是否以正确的方式将命令字符串发送到端口?因为第二个命令之间有一个+ 符号,我想这可能是错误的原因?

我尝试联系他们的支持,但没有反馈。所以我希望在这里得到一些帮助。

【问题讨论】:

  • 首先推荐使用异步通信而不是同步通信。如果您正确设计界面,也不需要睡眠说明。您应该以“\n\r”而不是“\r\n”来终止行。由于 Window 操作中内置的计时,数据可能会以块的形式返回,因此您需要一个循环并读取,直到您到达行尾。
  • @jdweng 关于如何在我的案例中使用异步通信的任何提示?
  • 另外,我认为 srPort.WriteLine() 命令已经根据您的操作系统附加了一个 '\r\n'。尝试使用 srPort.Write()
  • (char)(13) 不是必需的。这是你之前写的\r

标签: c# winforms c#-4.0 serial-port cdc


【解决方案1】:

所以在测试阅读和测试文档中的命令后,我意识到我的阅读器处于扫描模式,这意味着它忽略了发送到设备的所有命令。我关闭了扫描模式并能够获取卡的 UID。

我还将WriteLine 替换为 `Write' 并仅使用 ASCII 字节数组而不是字符串命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多