从c#中的串口设备读取数据

时间:2014-10-10 15:41:01

标签: c# winforms serial-port

我们需要权衡一堆产品,并将其重量存储在数据库中 我们有一个可以通过串口插入的秤,然后我们想用条形码扫描器扫描产品的条形码。

我需要编写一个能读取比例数据的程序。我已阅读并阅读了大量有关如何操作的文章,但我似乎无法使其发挥作用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Weighting
{
    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

        public Form1()
        {
            this.InitializeComponent();
            this.port.Open();

            this.port.Encoding = Encoding.ASCII;
            this.port.Handshake = Handshake.None;
            this.port.RtsEnable = true;
            this.port.ReceivedBytesThreshold = 1;

            this.port.DataReceived += new SerialDataReceivedEventHandler(this.port_DataReceived);
        }

        ~Form1()
        {
            this.port.Close();
            this.port.Dispose();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                char[] data = new char[] { 's', ' ', '\r', '\n' };
                this.port.Write(data, 0, 1);
                Thread.Sleep(500);
                var InputData = this.port.ReadLine();
                if (!string.IsNullOrEmpty(InputData))
                {
                    MessageBox.Show(InputData);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            var InputData = this.port.ReadLine();
            this.BeginInvoke(new Action(() =>
                {
                    MessageBox.Show(InputData);
                }));
        }
    }
}

永远不会触发DataReceived处理程序,ReadLine()永远不会返回任何内容。

规模的规格可以在这里找到(第10章):http://www.kern-sohn.com/manuals/files/English/FCB-BA-e-0911.pdf

请注意,我的串口或电缆无法正常工作,或者秤无法发送数据,或者其他任何内容(它已经大约15个)自从我使用串口设备以来的几年。如何测试一切是否有效?

谢谢!

更新

已从旧的Excel宏中获取(和解释)连接参数:

With MSComm1
    .CommPort = 1
    .Handshaking = 0
    .RThreshold = 1
    .RTSEnable = True
    .Settings = "9600,n,8,1"
    .SThreshold = 1
    .PortOpen = True
End With

这个宏据说可以用几年前的工作,但我自己也无法工作(MSComm1对象没有定义)。

2 个答案:

答案 0 :(得分:1)

您的连接设置看起来与文档相匹配,但您的代码闻起来相当多(这对您没有任何意义,.NET SerialPort是一个噩梦!)。

您没有将SerialPort.NewLine属性设置为Environment.NewLine(CRLF),而是使用默认值\n(LF)。仅这一点并不能解决问题,因为在调用ReadLine()的结果结束时你只需要一个回车符。

真正的问题是DataReceived处理程序。很多人建议使用它,但通过我的详尽测试,它大大减少了结果的确定性,特别是在以友好的编码(如ASCII)进行通信时。因为您通过发送s字符来启动命令,所以我会诚实地将其删除,然后在ReadLine()之后立即致电Write。 (您不需要Thread.Sleep因为ReadLine将直接阻塞,直到读入终止的字符串或达到超时)。

您的ReceivedBytesThreshold设置为1,并指定在提升DataReceived之前填充的缓冲区大小,因此您尝试为接收的每个字节读取整行(给予或接受,{{ 1}}非常不可预测。)

以下是我将如何清理它的示例(除了删除DataReceived处理程序)。我无法确定这是否能解决您的问题,但进行这些更正将使调试变得更加容易。作为帮助调试的临时更改,您可以重新启用Sleep调用并调用DataReceived而不是ReadExisting,并从缓冲区检查它的内容(如果有的话)。

ReadLine

我刚刚为我的公司编写了一个位于.NET SerialPort之上的库,并且遇到了同样的问题(再加上一百万个)。如果您想进一步澄清,请随时提出。

答案 1 :(得分:0)

正如@ user3894601指出的那样,问题是通过使用原始电缆和使用USB适配器解决的。