Tag: 串口

串口读取+线程还是更好的东西?

我不知道这是否是使用堆栈完成此任务的好方法,但我确信有更快的方法…我从微控制器获取数据但数据长度并不总是相同的长度。 我想也许我可以在我的堆栈中推送数据,在一个线程中我可以弹出它并解码消息。 我不想放慢DataReceivedHandler的速度,然后我创建了一个Thread,它可以弹出数据并将其写入我的decodeMessage()函数中的Listview。 一段时间后,我得到一个System.OutOfMemories例外.. 有什么想法我怎么能以更好的方式做到这一点? 当数据到达时,我正在从我的串口读取: Stack stack = new Stack(); ….. public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; byte[] data = new byte[sp.BytesToRead]; sp.Read(data, 0, data.Length); stack.Push(data); } 这是我的主题: private void formatData() { try { while (true) { byte[] data; int i=0; Dispatcher.BeginInvoke(new Action(() => { while (stack.Count > 0) […]

使用Async await方法异步读取串行端口

我用这种方式从串口读取: public static void Main() { SerialPort mySerialPort = new SerialPort(“COM1”); mySerialPort.BaudRate = 9600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); Console.WriteLine(“Press any key to continue…”); Console.WriteLine(); Console.ReadKey(); mySerialPort.Close(); } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = […]

通过不同的线程同时读取和写入串行端口是否安全?

通过不同的线程(一个读取线程和一个写入线程)同时读取和写入串行端口是否安全? 是否有必要在每个线程的读/写周围添加锁定?

如何使用.NET / C#进行强大的SerialPort编程?

我正在编写一个Windows服务,用于与串行磁条读取器和中继板(访问控制系统)进行通信。 在另一个程序通过打开与我的服务相同的串行端口“中断”进程后,我遇到了代码停止工作的问题(我得到IOExceptions)。 部分代码如下: public partial class Service : ServiceBase { Thread threadDoorOpener; public Service() { threadDoorOpener = new Thread(DoorOpener); } public void DoorOpener() { while (true) { SerialPort serialPort = new SerialPort(); Thread.Sleep(1000); string[] ports = SerialPort.GetPortNames(); serialPort.PortName = “COM1”; serialPort.BaudRate = 9600; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; if (serialPort.IsOpen) serialPort.Close(); […]

如何从串口读取时应用编码

我正在从串口读取数据。 我看了这篇post: http : //social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/a709d698-5099-4e37-9e10-f66ff22cdd1e 他正在撰写我遇到的许多问题,但在他的写作中他提到使用:System.Text.Encoding.GetEncoding(“Windows-1252”)。 我遇到的问题是何时以及如何应用此问题。 我认为有三个地方点。 定义串口对象时: private SerialPort comport = new SerialPort(); 事件处理程序: comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 或者在阅读数据时: string data = comport.ReadExisting(); 无论我在哪里添加它。 我似乎得到了错误。 如何使用编码?

Serial Port ReadLine vs ReadExisting或如何正确读取串口数据

我正在从串口读取数据。 数据来自规模。 我现在使用Readline()并在删除DiscardInBuffer()后删除数据。 从串口读取数据的正确方法是什么? 网上的例子很少,我觉得这就像是一些没有人想到的圣杯。 有什么帮助吗? 好像串口是一个反复无常的孩子。 C#,WinCE 5.0,HP瘦客户端,Compact framework 2.0 private void WeighSample() { this._processingDone = false; this._workerThread = new Thread(CaptureWeight); this._workerThread.IsBackground = true; this._workerThread.Start(); } //end of WeighSample() private void CaptureWeight() { globalCounter++; string value = “”; while (!this._processingDone) { try { value = this._sp.ReadLine(); if (value != “”) { if (value == […]

在C#中访问USB或串口

如何在C#中通过USB发送和接收? 串口和LPT怎么样?

SerialPort类偶尔会在Dispose上挂起

我已经编写了一个.net 4.0控制台应用程序,它定期与GSM调制解调器通信,以获取收到的SMS消息列表(它是一个USB调制解调器,但代码通过串口驱动程序连接到它并发送AT命令 – 顺便说一句,它是Sierra无线调制解调器,但我无法更改它,我有最新的驱动程序)。 会发生什么事情,经过一段时间(可能是几小时,也许几天),它就会停止工作。 这是一个日志片段…… 2012-04-17 23:07:31 DEBUG Modem Check (108) – Executing AT command ‘AT+CPMS=”ME”‘… 2012-04-17 23:07:31 DEBUG Modem Check (108) – Finished executing ‘AT+CPMS=”ME”‘ 2012-04-17 23:07:31 DEBUG Modem Check (108) – Detaching event handlers for ‘COM13’ 2012-04-17 23:07:31 DEBUG Modem Check (108) – Disposing the SerialPort for ‘COM13’ 这就是日志的结束 – 即使我希望至少再看一个语句,也就是相关的代码: internal […]

提供异步串口通信

目前,我们的应用程序通过串口连接到Arduino。 我们发送一些ASCII格式的命令,并得到相同的回报。 为此,我们有一个命令队列,一个专门用于将这些命令写入端口的线程,以及一个专门用于读取和处理所有传入回复的线程。 类本身负责调度回复,这给了它太多的责任(应该只负责端口操作,而不是业务逻辑)。 我们宁愿以异步方式执行此操作。 系统中的任何内容都可以发送带有回调函数和超时的命令。 如果串口得到正确答复,则调用回调函数。 否则,它会超时并可能调用第二个回调(或者可能是带有succeeded?标志的单个回调)。 但是,我们只使用异步方法(特别是在Web操作中),而不是编写这样的系统。 谁能给我们一些关于如何进行的指示? 我们当前的计划是存储这些命令的队列。 在任何回复时,如果找到相关联的命令(通过比较ASCII值),它将被出列并执行回调。 计时器将定期检查超时,出队并执行适当的回调。 这似乎是一个简单的解决方案,但支持这一点的代码数量正在大幅增加,我们希望确保没有更好的内置解决方案或最佳实践。 编辑 :为了进一步澄清,这个特定的类是一个单例(无论好坏),还有许多其他线程可以访问它。 例如,一个线程可能想要请求传感器值,而另一个线程可能正在控制电机。 这些命令及其相关的回复不是以线性方式发生的; 时机可能会逆转。 因此,传统的生产者 – 消费者模式是不够的; 这更像是一个调度员。 例如,让我们调用这个单例类Arduino 。 Thread A正在运行,并且想要发送命令”*03″ ,因此它调用Arduino.Instance.SendCommand(“*03″) 。 同时, Thread B发送命令”*88” ,这两个命令都是近实时发送的。 一段时间之后, Arduino的SerialPort.Read()线程获取*88的回复然后回复*03 (即以相反的顺序发送它们)。 我们如何允许Thread A和Thread B正确阻止等待特定的回复进来? 我们假设我们将在每个线程中使用AutoResetEvent ,并使用异步回调让我们设置它。

SerialPort问题

我正在使用SerialPort与条形码阅读器进行通信(只读)。 我已经安装了驱动程序来操作阅读器,就好像它是通过Com-port连接的,虽然它是一个usb设备。 插入设备后,列表中会再出现一个Com-port。 问题如下。 我初始化SerialPort对象以从条形码阅读器读取,但如果读取器被拔掉,我无法正确完成或处置SerialPort对象,因为它“附加”的端口不再存在。 程序关闭时,结果是WinIOException。 我不仅在使用SerialPort的代码中捕获它,而且在program.cs级别也是如此。 根据堆栈,在尝试完成和处理SerialPort对象后抛出WinIOException。 有没有想法如何正确操作这种情况? 或者至少要抓住例外? 我确切知道的是问题不在于这个特定的驱动程序; 我还有一个来自另一个制造商的条形码阅读器(具有相同的目的驱动程序) – 情况是相同的。