【问题标题】:Not able to read barcode with c# or getting unknown characters无法使用 c# 读取条形码或获取未知字符
【发布时间】:2016-09-26 09:44:21
【问题描述】:

我遇到错误

System.TimeoutException was unhandled The operation has timed out... etc

当我试图读取条形码时,我尝试了很多方法来解决它,但没有任何结果。

我多次检查了与 Windows 设备管理器匹配的 SerialPort 参数。

我尝试替换

String data = _serialPort.ReadLine(); 

String data = _serialPort.ReadByte().ToString(); 

如您所见,但它显示未知数字,例如 12 然后删除然后 26 等等。

我尝试更改编码,但是当我更改编码时,我得到了未知字符,例如空方块黑色三角形或扑克牌符号等。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    static SerialPort _serialPort;
    private delegate void SetTextDeleg(string text);

    private void Form1_Load(Object sender, EventArgs e)
    {
        _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
        _serialPort.Handshake = Handshake.None;
        _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
        // Encoding
        //_serialPort.Encoding = Encoding.ASCII;
        _serialPort.Encoding = Encoding.Default;

        _serialPort.Open();
    }

    private void btnStart_Click(Object sender, EventArgs e)
    {
        try
        {
            if (!_serialPort.IsOpen)
                _serialPort.Open();

            _serialPort.Write("SI\r\n");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
    }

    void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(2000);
        String data = _serialPort.ReadLine();
        //String data = _serialPort.ReadByte().ToString();
        this.BeginInvoke(new SetTextDeleg(si_DataReceived), new Object[] { data });
    }

    private void si_DataReceived(String data)
    {
        textBox1.Text = data.Trim().ToString();
        //textBox1.Text = data;
        //label1.Text = data;
    }
}

【问题讨论】:

  • SerialPort 的参数是否与您的 Windows 设备管理器匹配?有时我设置了错误的波特率。
  • @c0d3b34n 是的,我检查了很多次,并尝试替换 String data = _serialPort.ReadLine();带字符串数据 = _serialPort.ReadByte().ToString();如您所见..但这向我显示了未知的数字,例如显示 12 然后删除然后删除 26 等
  • @PhillipH 这是他无法阅读的不同大小写我告诉你我可以阅读但我在阅读时遇到错误,当我更改编码时,我会收到未知字符.. 像黑色的空方块三角形或扑克牌符号等蚀刻
  • 啊,关于你的实际症状的更多信息@useroo1oo :-)

标签: c# barcode barcode-scanner


【解决方案1】:

这个怎么样?

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort spL = (SerialPort) sender;
    byte[] buf = new byte[spL.BytesToRead];
    spL.Read(buf, 0, buf.Length);
    string data = System.Text.Encoding.Default.GetString(buf);
}

【讨论】:

  • 你不能忽略Read返回的字节数,你得到的字节数可能比你请求的少。
  • 但是可读字节的数量不是由 SerialPort.BytesToRead 属性定义的吗?
  • 我会担心内部缓冲区,如果BytesToRead 大于SerialPort 内的某些内部流缓冲区,则读取可能只读取一个缓冲区的值。我可能是错的,但我不会在我的生产代码中冒险。因为我不确定它是否会发生,所以我只发表了评论,而不是投反对票和评论。
  • @ScottChamberlain 那么你建议我做什么?
  • 正常的方法是有一个while循环,一直调用Read,直到所有字节都被读取到你所期望的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多