Tag: 串口

为什么我在C#中从串口获得部分奇怪的值

我正在开发一个处理规模数据的程序。 秤通过USB串口连接。 我正在使用此问题中的代码: 如何通过串口RS-232或USB转换器将称重秤的重量显示到文本框中? 。 所以最重要的部分是工作。 我从秤上得到了重量作为一个字符串。 我的问题是,当秤将重量值(10 / s)发送到计算机时,我得到以下值,例如: 13,0g; 13,0g; 12,9g; ,8G; 12,7g; 2,6g; 12,5g; 12,4g; ,3G; 2,2g; 12,1g; 您可以看到,某些值已损坏,有时第一个字符丢失,或者有时前两个字符…当我尝试使用来自秤制造商的其他程序读取值时,其工作正常,所有值是正确的。 那么问题是什么? 我尝试了不同的波特率和其他设置,没有任何帮助。 希望可以有人帮帮我。 这是我用来从链接页面读取串口数据的代码。 using System; using System.IO.Ports; //<– necessary to use "SerialPort" using System.Windows.Forms; namespace ComPortTests { public partial class Form1 : Form { private SerialPort _serialPort; //<– declares a SerialPort Variable […]

计算块检查字符(BCC)以进行串行通信

我通过SerialPort类的.NET通过串口与设备进行通信,并根据我需要计算“块检查字符”的第三方设备规范要求。 我被告知的唯一信息是它是一个异或运算(XOR) ,它必须在所有字符上执行。 所以,如果我有字符串“Bob,001”,那么如何计算BCC?

确定串行端口是正常的COM还是SPP

我正在寻找一种方法来确定COM是标准COM还是SPP COM,也称为COM设备的电缆替换蓝牙适配器。 我有一个可以在USB(COM – > USB)和蓝牙中工作的设备,蓝牙接口可以与SPP配合使用。 我目前正在使用System.IO.Ports.SerialPort.GetPortNames()来获取COM。 有没有办法确定它是否与蓝牙或USB连接? 解: System.Management.ManagementObjectSearcher Searcher = new System.Management.ManagementObjectSearcher(“Select * from WIN32_SerialPort”); foreach (System.Management.ManagementObject Port in Searcher.Get()) { foreach (System.Management.PropertyData Property in Port.Properties) { Console.WriteLine(Property.Name + ” ” + (Property.Value == null ? null : Property.Value.ToString())); } } 输出类似于: Availability 2 Binary True Capabilities CapabilityDescriptions Caption Standard Serial over Bluetooth […]

c#串口数据丢失

我编写了一个C#程序来接收COM2端口上的数据。 波特率设置为115200.发送方以115200bps的速率发送数据。 我的程序偶尔会丢失几个字节。 我正在调用ReadByte方法从com端口读取while(true)循环中的数据。 我有几个问题: 当波特率设置为高时,我是否应该丢失数据? 如果有,为什么? 我将readbuffer大小设置为100 * 1024 * 1024。 这是否将串行驱动程序缓冲区大小设置为100 * 1024 * 1024? 有关如何调试此问题的任何想法?

SerialPort在关闭后触发DataReceived事件

我在尝试停止SerialPort时遇到了一种奇怪的行为:DataReceived事件在取消订阅后以及在调用close之后继续触发! (请参阅以下代码中的StopStreaming )。 结果,在我的事件处理程序代码中,我得到一个InvalidOperationException,并显示“端口已关闭”的消息。 我错过了什么? 关闭端口和停止事件的正确方法是什么? 编辑:我每次运行代码时都会收到此错误。 所以这不是随机发生的竞争条件,而是一个系统性问题,表明代码完全破碎! 但是,我没有看到…… private SerialPort comPort = new SerialPort(); public override void StartStreaming() { comPort.Open(); comPort.DiscardInBuffer(); comPort.DataReceived += comPort_DataReceived; } public override void StopStreaming() { comPort.DataReceived -= comPort_DataReceived; comPort.Close(); isStreaming = false; } private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (e.EventType == SerialData.Chars) { SerialPort port = (SerialPort)sender; […]

SerialPort类和DataReceived事件……获取字节。 使用ReadLine还是ReadExisting? 任何例子?

我想通过串口发送和接收字节。 我的接收器应该异步获取字节。 我写了下面似乎有效的小例子,但它给我留下了不安的感觉。 我真的应该使用WriteLine,ReadLine吗? 正如现在所写的那样,是否有可能为每个字节调用事件处理程序m_port_DataReceived中的代码? 这是我对“DataReceived”事件的理解; 也许我错了。 ReadLine会阻塞,直到它看到行尾字符? 我应该以某种方式在事件处理程序中使用“if(e.EventType == SerialData.Eof)”构造吗? 你可以看到我已将它注释掉了。 我试过了,无法让它发挥作用。 什么时候会期待SerialData.Eof? 我的想法是,在调用“ReadExisting”之前,我可以在所有字节出现之前等待。 但是,“if”语句从未评估为true。 强制代码转到ReadExisting但是正确读取了所有字节。 一般来说,设置我的代码以接收来自串口的字节的最佳方法是什么? 发送方将每125毫秒发送一小块字节,但不会发送特殊字符。 字节数据包在时间上是间隔开的,所以我认为没有将数据包混合在一起的问题。 更问题的是,“一旦你看到一个字节,就去读一切,只要你等待很短的时间,你就会得到一切”。 鉴于这种情况,有一种首选方式吗? 提前谢谢,戴夫 public class SerialPortController { SerialPort m_port; public SerialPortController(bool server) { if (server) { m_port = new SerialPort(“COM4”); m_port.BaudRate = 115200; m_port.Open(); byte[] sillyBytes = new byte[] { 0, 1, 2, 3, 4, […]

通过c#中的设备名称获取蓝牙设备的COM端口

我在C#中编写了一些代码来获取COM端口,其中映射了具有特定名称的蓝牙设备。 我尝试了几个与此处列出的解决方案类似的解决方案,但是没有一个解决方案我可以访问蓝牙设置窗口中的名称,如下图所示: 如果它在那个窗口,我肯定有办法找到它。 有帮助吗? 非常感谢

C#serialPort速度

我正在为基于串行通信的某种协议开发一些监控工具。 Serial BaudRate = 187,5kb我使用System.IO.Ports.SerialPort类。 该协议有4种帧。 他们有1Byte,3Bytes,6Bytes,10-255Bytes。 我可以和他们一起工作,但我收到他们的时间太迟了 。 一开始我收到的第一个包装在前。 96毫秒(太晚了),它包含大约1000B。 这意味着20-50帧(太多,太晚了)。 后来它的工作更加稳定,3-10Bytes但是现在还为时已晚,因为它包含1-2帧。 当然1帧是可以的,但2太晚了。 你能指点我怎样才能更可靠地处理它? 我知道这是可能的。 Revision1: 我试了一下: private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (!serialPort1.IsOpen) return; this.BeginInvoke(new EventHandler(this.DataReceived)); } 和Backgroud工作者:并且…新Tread(阅读)和……总是一样的。 太迟了,太慢了。 我是否必须返回WinApi并导入一些kernel32.dll函数? 修订版2:这是Treading方式中代码使用的一部分: int c = serialPort1.BytesToRead; byte[] b = new byte[c]; serialPort1.Read(b, 0, c); 我想这是在SerialPort类中使用流的一些问题。 或者一些同步问题。 修订版3:我不会同时使用这两个! 我只是尝试了不同的方式。 关注MarekK

UWP中串行设备通信的问题

我有一个特殊的问题。 我正在尝试与需要在UWP项目中进行串行通信的外围设备进行通信。 我正在使用Windows.Devices.SerialCommunication。 为了演示,我创建了一个新页面,其中有两个按钮,两个不同的点击处理程序。 一个用于打开端口,另一个用于向外围设备发送消息。 一个处理程序是: SerialDevice device; private async void Button_Click_1(object sender, RoutedEventArgs e) { string selector = SerialDevice.GetDeviceSelector(“COM7”); DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector); if (devices.Any()) { DeviceInformation deviceInfo = devices.First(); device = await SerialDevice.FromIdAsync(deviceInfo.Id); //********************* device.BaudRate = 9600; device.DataBits = 8; device.Parity = SerialParity.None; device.StopBits = SerialStopBitCount.One; device.ReadTimeout = device.WriteTimeout = TimeSpan.FromMilliseconds(1000); device.Handshake […]

C# – 从串口缓冲区读取

我正在尝试从RS-232端口读取数据。 有没有人有一个如何从端口/缓冲区获取数据的例子,并确保我拥有所有数据,因为它可以是多行数据。 我只是按如下方式阅读? string Rxstring = port.ReadLine(); Console.WriteLine(Rxstring);