我们需要权衡一堆产品,并将其重量存储在数据库中 我们有一个可以通过串口插入的秤,然后我们想用条形码扫描器扫描产品的条形码。
我需要编写一个能读取比例数据的程序。我已阅读并阅读了大量有关如何操作的文章,但我似乎无法使其发挥作用。
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对象没有定义)。
答案 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适配器解决的。