2016-10-08 63 views
0

我试图为称重桥架制作软件,同时尝试读取使用C#代码,它显示类似下面如何使用C#

 
)0 12589 00 
)0 12589 00 
)0 12589 00 
)0 12589 00 
)0 12589 00 
)0 12589 00 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    string Port = GenDbUtility.GetElixirConfigValue("SERIAL_PORT", Globals.CompCode); 

    //<-- This block ensures that no exceptions happen 
    if (serialPort1 != null && serialPort1.IsOpen) 
     serialPort1.Close(); 
    if (serialPort1 != null) 
     serialPort1.Dispose(); 
    //<-- End of Block 


    serialPort1 = new SerialPort("COM1");  //<-- Creates new SerialPort using the name selected in the combobox 
    serialPort1.Encoding = Encoding.ASCII; 
    serialPort1.BaudRate = 9660; 
    serialPort1.Parity = Parity.None; 
    serialPort1.StopBits = StopBits.One; 
    serialPort1.DataBits = 50; 
    serialPort1.Handshake = Handshake.None; 
    serialPort1.RtsEnable = true; 
    serialPort1.ReadBufferSize = 4096; 
    serialPort1.ReceivedBytesThreshold = 100000; 
    serialPort1.NewLine = "\r\n"; 
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 
    serialPort1.Open();  //<-- make the comport listen 
} 

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    if (serialPort1.IsOpen) 
    { 
     SerialPort sp = (SerialPort)sender; 

     string newVal = sp.ReadExisting().ToString(); 
     ///string[] qty = newVal.Split(' '); 
     //txtQuantity.Invoke(this.myDelegate, new Object[] { qty[3].ToString() }); 
     //string[] qty = newVal.Split(' '); 
     //decimal Quantity1 = Convert.ToDecimal(qty[0]); 
     //decimal Quantity2 = Convert.ToDecimal(qty[1]); 
     //decimal Quantity3 = Convert.ToDecimal(qty[2]); 
     //decimal Quantity4 = Convert.ToDecimal(qty[3]); 
     //txtQuantity.Text = Quantity3.ToString(); 

     //if (String.Compare(txtQuantity.Text, qty[3]) != 0) 
     //{ 
     // txtQuantity.Text = Convert.ToString(qty[3]); 
     // //lblweight.Text = Convert.ToString(qty[2]); 
     //  //qty[2].ToString(); 
     //} 
    } 
} 
+0

你正在阅读的数据包中的每个字节应该是有意义的。阅读他们的意思文档。并非全部都是数据。 – Ogbe

+0

可能会尝试使用工具来读出COM端口以将结果与您收到的结果进行比较。可能适应COM端口的项目会返回错误的数据。 – Oswald

+0

尝试像MSDN(https://msdn.microsoft.com/en-us/library/system.io.ports.serialport(v=vs.110).aspx)中的示例一样实现串行端口读取器有一个完整的示例你可以使用的课程。 – Oswald

回答

1
一些其他的数据进行处理的数据读取系统的串口数据

串口不知道“消息”有多长。您正在阅读的设备将发布某种形式的协议,您需要遵循以阅读正确的数据。

你不能假设sp.ReadExisting()将数据正好一个消息值得的,它可能有不到一个完整的消息,并可以结合两个消息的若干部分,并返回它作为一个结果(这是你所遇到的问题) 。去阅读称重桥的文件,只读出你应该读出的部分。

-1

com端口可以像驱动器一样打开,即COM1:而不是例如。 C: 我没有足够的C#知道文件系统的功能,但是在C/C++中它的fopen()等

+0

这与OP的问题无关。他可以打开com端口,并从中获取数据。他只是不明白为什么他回来的数据不符合他的预期。 –