Tag: 串口

C#:使用Winforms关闭SerialPort的正确方法

我有一个应用程序,我从串口读取,一切顺利,直到我关闭应用程序。 当我点击[X]时,应用程序只是挂起,UI:无响应。 我从DataReceived事件处理程序中的端口读取,并在FormClosed发生时关闭端口: private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); }

短信通过串口连接诺基亚手机

我正试图通过串口发送短信,这很容易通过腻子。 诺基亚文档中的命令工作正常。 但是,尝试从ac#应用程序发送相同的命令失败了。 我已经运行了Sysinternals PortMon并且可以看到命令通过OK,我能看到的唯一区别在于它连接的方式,但是我找不到可以解决这些差异的命令。 我正在运行的代码看起来有点像这样 using (SerialPort port = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One)) { port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); port.ErrorReceived += new SerialErrorReceivedEventHandler(port_ErrorReceived); //port.ReceivedBytesThreshold = 1; port.DtrEnable = true; port.RtsEnable = true; port.ReadTimeout = 1; port.Handshake = Handshake.XOnXOff; try { port.Open(); port.WriteLine(“AT”); port.WriteLine(“AT+CMGF=1”); port.WriteLine(“AT+CMGS=\”” + number + “\””); port.WriteLine(message); port.Write(new byte[] { (byte)26 […]

串行数据的二进制通信协议解析器设计

我正在重新审视字节流的通信协议解析器设计(串行数据,一次接收1个字节)。 数据包结构(不能更改)是: || Start Delimiter (1 byte) | Message ID (1 byte) | Length (1 byte) | Payload (n bytes) | Checksum (1 byte) || 过去,我已经采用程序状态机方法实现了这样的系统。 当每个数据字节到达时,状态机被驱动以查看输入数据一次/一个字节是否适合有效数据包,并且一旦整个数据包被组装,基于消息ID的switch语句执行适当的消息处理程序。 在一些实现中,解析器/状态机/消息处理程序循环位于其自己的线程中,以便不对串行数据接收的事件处理程序造成负担,并且由指示字节已被读取的信号量触发。 我想知道是否有更优雅的解决方案来解决这个常见问题,利用C#和OO设计的一些更现代的语言function。 任何可以解决这个问题的设计模式? 事件驱动vs polled vs组合? 我很想听听你的想法。 谢谢。 Prembo。

System.IO.Ports.SerialPort和multithreading

我有一些常常需要从串行接口(例如COM1)读取数据的SerialPort代码。 但这似乎是CPU密集型的,如果用户移动窗口或者正在向窗口显示大量数据(例如通过串行线路接收的字节),那么通信就会搞砸。 考虑以下代码: void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] buffer = new byte[port.ReadBufferSize]; var count = 0; try { count = port.Read(buffer, 0, buffer.Length); } catch (Exception ex) { Console.Write(ex.ToString()); } if (count == 0) return; //Pass the data to the IDataCollector, if response != null an entire frame has been received var response […]

SerialPort编码 – 如何获得8位ASCII?

我遇到了通过串口通信的程序的问题。 它必须发送和接收的一个字符是度符号,ASCII 0xBF。 它已经工作好多年了,现在突然串口对象开始丢失第7位,所以我得到0x3F而不是0xBF。 我确信这是我做过的傻事,因为我在那个区域修改了我的代码 – 但是我看不出我做了什么导致了第8位的丢失。 我的端口初始化如下: BaudRate 9600 int DataBits 8 int DiscardNull true bool DtrEnable true bool Encoding {System.Text.ASCIIEncoding} System.Text.Encoding Handshake None System.IO.Ports.Handshake NewLine “\n” string Parity None System.IO.Ports.Parity ParityReplace 63 byte PortName “COM4” string ReadBufferSize 128 int ReadTimeout 250 int ReceivedBytesThreshold 1 int RtsEnable true bool StopBits One System.IO.Ports.StopBits WriteBufferSize 64 […]

Windows XP嵌入式版本上System.IO.IOException的原因是什么?

我在Windows XP embadded版本上运行.Net 3.5应用程序。 此应用程序通过串行(COM)端口写入和读取一些数据。 该应用程序在我的笔记本电脑(Windows XP Professional)上工作正常,但在Windows XP嵌入式上没有。 我一直收到这个错误: System.IO.IOException:由于线程退出或应用程序请求,I / O操作已中止。 可能是什么造成的呢? 一些额外的信息:阅读,我使用ReadExisting而不是Readline 。 在阅读之前,我也确保端口也是打开的。 System.IO.IOException: The I/O operation has been aborted because of either a thread exit or an application request. at System.IO.Ports.SerialStream.EndRead(IAsyncResult asyncResult) at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout) at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count) at System.IO.Ports.SerialPort.ReadExisting() […]

指定的参数超出了有效值的范围。 参数名称:大小和串口通信

我需要创建一个应用程序,它需要使用TCP / IP与现有软件进行通信,其中我和其他应用程序将使用下面指定的端口号。 private void frmScan_Load(object sender, EventArgs e) { clientSocket.Connect(“100.100.100.30″, 76545); } public void msg(string mesg) { textBox1.Text = textBox1.Text + Environment.NewLine + ” >> ” + mesg; } private void cmdSCANok_Click(object sender, EventArgs e) { msg(“Client Started”); NetworkStream serverStream = clientSocket.GetStream(); byte[] outStream = Encoding.ASCII.GetBytes(“PCK|SCAN|5025066840471”); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); byte[] inStream = new […]

以编程方式获得友好的端口名称

这里有人知道我可以在PC上找到端口名称吗? 使用此代码: For i As Integer = 0 To My.Computer.Ports.SerialPortNames.Count – 1 cmbPort.Properties.Items.Add(My.Computer.Ports.SerialPortNames(i)) Next 我可以得到COM26等等,但这不是我想要的。 而不是检索COM26 ,我想要USB-SERIAL CH340或USB-SERIAL CH340 (COM26) 。 我怎么能这样做?

C#serialport和hyperterminal

我正在使用c#和Serialport和com0com(虚拟串口)我的问题是我的c#应用程序无法从超级终端重新获取数据,事件DataRecived未被触发,如果我调用manualy readExisting我什么都没有来测试这个问题你可以如果您运行此应用程序的2个实例,请创建一个基本的c#应用程序,就像这个有相同问题的应用程序http://balau82.wordpress.com/2009/04/18/simplest-serial-port-terminal-in-csharp/没关系,但是如果你运行一个实例并且超级终端,数据会从C#发送到hipererminal但不会从hyperterm发回。

是否有必要同步.NET SerialPort写/读?

在我的应用程序中,我使用.NET SerialPort类来读取和写入数据。 使用DataReceived事件完成读取,我假设在ThreadPool线程内部。 写作由UI线程(WinForms)完成。 我想知道,如果有必要同步对SerialPort实例的访问,那么不会同时发生读/写。 我的良心告诉我,我应该锁定这些调用,但我很困惑,因为我在互联网上找到的所有C#SerialPort示例根本不使用锁定。