首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.IO.Serial

System.IO.Serial
EN

Stack Overflow用户
提问于 2012-11-18 20:44:23
回答 1查看 1.8K关注 0票数 0

我有一个usb设备,应该在查询时发送一个号码。

我得到的指示是:

  1. 将USB端口连接到PC机上,然后打开9600波特的虚拟串口,8位数据位,无奇偶校验,1位停止位。
  2. 发送ESC (我想是27字符)
  3. 你会得到">“作为确认
  4. 发送"c“,您将得到计数后的"<”

我到处都找过了,不能理解我在读什么,因为我不知道如何从这个单位得到回应。

  1. 我是否正确地发送了"ESC“密钥?
  2. 我是否正确地询问了一个答复?
  3. 我是否正确地显示了假设的响应?
  4. libusb是我需要研究的东西吗?我以为它是.NET早期版本的库。

提前谢谢。

这是我的代码:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace SerialPortTest
{
public partial class Form1 : Form
{
    System.IO.Ports.SerialPort counter = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
    public Form1()
    {
        InitializeComponent();
    }

    private void btnWrite_Click_1(object sender, EventArgs e)
    {
        // Get a list of serial port names. 
        string[] ports = System.IO.Ports.SerialPort.GetPortNames();

        lblOut.Text = ("The following serial ports were found:");

        // Display each port name to the console. 
        txtOut.Clear();
        foreach (string port in ports)
        {
            txtOut.Text = (port);
        }
    }

    private void Form1_KeyDown_1(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.A)
        {
            //configuring the serial port
            //serialPort1.PortName = "COM5";
            //serialPort1.BaudRate = 9600;
            //serialPort1.DataBits = 8;
            //serialPort1.Parity = Parity.None;
            //serialPort1.StopBits = StopBits.One;

            //Open the serial port
            serialPort1.Open();

            //Write data to serial port
            serialPort1.Write(Keys.Escape.ToString());

            //Read data from serial port
            //string[] number;
            //counter.DataReceived += counter.ReadExisting();
            //counter.ReadLine();
            //new SerialDataReceivedEventHandler(counter_DataReceived);
            txtOut.Text = counter.ReadLine();

            //Close the serial port
            serialPort1.Close();
        }
    }

    //private static SerialDataReceivedEventHandler counter_DataReceived(object sender, SerialDataReceivedEventArgs e)
    //{
    //    //throw new NotImplementedException();
    //    SerialPort sp = (SerialPort)sender;
    //    string indata = sp.ReadExisting();
    //    return (sp.ReadExisting());
    //}
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-18 21:11:59

counter.ReadLine()只在读取换行符时才会返回,根据您给出的规范,这是永远不会发生的。

在第一个输入之后,您需要返回一个字节的输出,因此您应该读取一个字节。然后,您需要发送一个c,之后您将不得不阅读,直到遇到一个<

所以像这样的事情应该有效:

代码语言:javascript
复制
SerialPort serialPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);

var esc = new byte { 27 };
var c = new byte { 99 };

serialPort.Write(esc, 0, 1);

serialPort.ReadTo(">"); // Or ReadByte() and check if the byte read has a value of 62

serialPort.Write(c, 0, 1);

string data = serialPort.ReadTo("<");

然后,您可以将数据字符串解析为您期望的任何格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13444370

复制
相关文章

相似问题

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