C# 使用C从Com1端口读取数据#

C# 使用C从Com1端口读取数据#,c#,serial-port,C#,Serial Port,我正在尝试编写一个程序,可以读取通过COM1连接的当前电子秤(Mettler Toldeo pg802-S)的输入。根据目前的代码,我可以列出所有提供的COM,但在规模推动下,我无法将其列出 电子秤位于COM1上,因此我正在尝试获取电子秤正在推送的数据。使用WinWedget,我可以使用Com1、2400波特率、偶数奇偶校验、七个数据位、一个停止位、无流控制、1024个输入缓冲区大小和512个输出缓冲区大小来推送结果。我如何通过这种方式获取数据 using System; using Syste

我正在尝试编写一个程序,可以读取通过COM1连接的当前电子秤(Mettler Toldeo pg802-S)的输入。根据目前的代码,我可以列出所有提供的COM,但在规模推动下,我无法将其列出

电子秤位于COM1上,因此我正在尝试获取电子秤正在推送的数据。使用WinWedget,我可以使用Com1、2400波特率、偶数奇偶校验、七个数据位、一个停止位、无流控制、1024个输入缓冲区大小和512个输出缓冲区大小来推送结果。我如何通过这种方式获取数据

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;


namespace SerialPortWrite{
    class GetSerialData{
        static void Main(string[] args){

            Form1 form1 = new Form1();
            form1.ShowDialog();

             Console.WriteLine("Program Started For COM1...");
            // List all COMS
             ListComPorts();

            // Read this COM.
            var reader = new ArduinoSerialReader("COM1");

            // Read COM input.
               Console.ReadLine();
        }

        static void ListComPorts(){
            // Get a list of port names. 
            string[] ports = SerialPort.GetPortNames();

            Console.WriteLine("The following serial ports were found:");

            // Get all COM ports to list out. 
            foreach (string port in ports){
                Console.WriteLine(port);
            }
        }
    }

    // Get input.
    public class ArduinoSerialReader : IDisposable{
        private SerialPort _serialPort;

        public ArduinoSerialReader(string portName){
            _serialPort = new SerialPort(portName);
            _serialPort.Open();
            _serialPort.DataReceived += serialPort_DataReceived;
        }

        void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e){
            Console.WriteLine(_serialPort.ReadLine());
        }

        public void Dispose(){
            if (_serialPort != null){
                _serialPort.Dispose();
            }
        }
    }
}

要从c#中的串行端口接收数据,可以使用
SerialPort
class。您可以使用单独的线程从端口连续读取数据并对其进行处理。请参见下面的示例代码:

void readFromSerial()
{
    SerialPort sp;
    try
    {
        string[] ports = SerialPort.GetPortNames();    // get all the available port names in string array
        if (ports.Length > 0)
        {
            // create SerialPort object 
            sp = new SerialPort(ports[0], 2400, Parity.Even, 7, StopBits.One);
            sp.Open();

            string str = "";
            // infinite loop to read data byte by byte. you can also use for loop to read constant amount of bytes
            while (true)
            {
                // sp.ReadByte is blocking read, it will wait until a byte is available for reading
                byte data = (byte)sp.ReadByte();
                Console.Write(" "+data);
                str += data + " ";
            }
        }
    }
    catch(Exception ex)
    {}
    finally
    {
        if (sp != null && sp.IsOpen())
            sp.Close();
    }
}
然后像这样创建一个单独的线程

Thread t = new Thread(new ThreadStart(readFromSerial));
t.Start();

要从c#中的串行端口接收数据,可以使用
SerialPort
class。您可以使用单独的线程从端口连续读取数据并对其进行处理。请参见下面的示例代码:

void readFromSerial()
{
    SerialPort sp;
    try
    {
        string[] ports = SerialPort.GetPortNames();    // get all the available port names in string array
        if (ports.Length > 0)
        {
            // create SerialPort object 
            sp = new SerialPort(ports[0], 2400, Parity.Even, 7, StopBits.One);
            sp.Open();

            string str = "";
            // infinite loop to read data byte by byte. you can also use for loop to read constant amount of bytes
            while (true)
            {
                // sp.ReadByte is blocking read, it will wait until a byte is available for reading
                byte data = (byte)sp.ReadByte();
                Console.Write(" "+data);
                str += data + " ";
            }
        }
    }
    catch(Exception ex)
    {}
    finally
    {
        if (sp != null && sp.IsOpen())
            sp.Close();
    }
}
然后像这样创建一个单独的线程

Thread t = new Thread(new ThreadStart(readFromSerial));
t.Start();

我开发了一个用于将电子秤连接到c#的库,该库有一个组件,可配置用于所有电子秤的continuos通信,需要命令或不需要发送到电子秤的命令,实际上可以使用arduino电子秤模拟器和JUSTA LS7510A指示器进行尝试,该指示器是其库的代码


我开发了一个用于将电子秤连接到c#的库,该库有一个组件,可配置用于所有电子秤的连续通信,需要命令或不需要发送到电子秤的命令,实际上可以尝试使用arduino电子秤模拟器和指示灯JUSTA LS7510A,其库代码为on


因此,您已经知道您需要的COM连接设置。到底是什么阻止您在代码中使用这些设置?您的代码没有端口设置。这是第一个问题。第二个问题:据我所知,大多数天平都要求您向天平发送特定格式的数据包以获得响应。但是,有些秤在秤键盘上输入项目编号后会发送EAN-13代码。你们有哪种型号的?(在第一种情况下,此程序无法工作,因为您不向端口发送任何内容,并且响应主要以二进制数据而不是文本的形式发送。)我不确定,即使对于第二种类型,中的代码是否也能工作。(我家里没有串行端口。)@Julo是正确的,我相信这应该是一个答案。因此,您已经知道您需要的COM连接设置。到底是什么阻止您在代码中使用这些设置?您的代码没有端口设置。这是第一个问题。第二个问题:据我所知,大多数天平都要求您向天平发送特定格式的数据包以获得响应。但是,有些秤在秤键盘上输入项目编号后会发送EAN-13代码。你们有哪种型号的?(在第一种情况下,此程序无法工作,因为您不向端口发送任何内容,并且响应主要以二进制数据而不是文本的形式发送。)我不确定,即使对于第二种类型,中的代码是否也能工作。(我家里没有串行端口。)@Julo是正确的,我相信这应该是一个答案。