Tag: serial port

如何通过rs232与秤进行通信

我试图通过使用.net中的SerialPort类使我的C#应用​​程序通过rs232与数字秤进行通信。 不幸的是,我无法从规模中得到任何反馈。 这是一个TSCALE TSQSP量表,显然它正在使用CAS通信协议。 根据我对CAS协议的理解,我需要发送“ENQ”等待“ACK”,然后发送“DC1”来获取信息,但是在发送“ENQ”之后我没有收到任何回复。 这是我的代码。 有没有人有相同通信协议的规模经验? 非常感谢您的帮助 public partial class Form1 : Form { private SerialPort port = new SerialPort(“COM6”, 4800, Parity.None, 8, StopBits.One); public Form1() { InitializeComponent(); port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); port.Open(); } private void button1_Click(object sender, EventArgs e) { port.Write(“ENQ”); } private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { this.textBox1.Text = port.ReadExisting(); } […]

拔下USB时,COM端口消失

我正在使用USB端口作为连接器为平板电脑设计一种基于Arduino的扩展坞。 这意味着我需要支持在平板电脑上的应用程序运行时插拔USB连接器的能力。 平板电脑运行ac#应用程序(Win7 64位上的.net 4.5),我将连接到Arduino Uno。 启动应用程序时,我使用以下命令循环所有可用的COM端口: var ports = SerialPort.GetPortNames(); // -> [COM3,COM4,COM8] foreach (var port in ports) { var serial = new SerialPort(portname, baudRate); //attempt handshake and connect to right port } 这工作正常,但如果我拔下并重新插入USB电缆并重新尝试重新连接到Arduino(当应用程序仍在运行时),Arduino端口(COM8)不再列在: SerialPort.GetPortNames(); // -> [COM3,COM4] and no COM8 即使重新启动应用程序(使用Arduino重新插入)也会导致仅列出[COM3,COM4]。 让它恢复工作的唯一方法是在应用程序未运行时拔掉并重新插入Arduino。 令我困惑的是,当我在启动应用程序后插入Arduino Uno时,SerialClass会识别新添加的端口并允许我连接。 只有在应用程序运行时拔出并重新插入设备时才会出现此问题。 似乎尽管能够重置COM端口(在代码中或在设备管理器中手动),但SerialClass(以及本机Win32_SerialPort – 我也检查了这一点)无法识别这一点,除非我重新启动应用程序 这可能是什么原因? 如何确保我的应用程序可以重新连接到该端口? 有没有其他方法可以使用SerialPort来处理USB连接器?

串行通信和CRLF C#

我在向串口发送字符串后对CRLF有疑问。 让我解释一下我想做什么,在这里有一个例子。 [ACR] CRLF 10:90 CRLF 11:20 CRLF 12:2.1 CRLF 这就是我想要做但我无法到达任何地方,有人可以帮我这个。 我想我必须做CRLF才能开始换行,但如果你有其他建议他们会更受欢迎这就是我所做的: 码: private void SendMessageTest() { var content = _durCleaningTextbox.Text; byte[] array = ComPort.StringToBytes(content); _comport.WriteBytes(array); _comport.ReadBytes(array, array.Length, 1000); string result = Encoding.ASCII.GetString(array); MessageBox.Show(result); } using System; using System.IO; using System.Text; using System.IO.Ports; namespace Communication { public class ComPort { private readonly SerialPort _serialPort; public […]

C#读Arduino

我正在尝试创建一个从Arduino读取传出信号的应用程序,但我无法在C# Windows窗体中使用它 ,只能在控制台中使用。 我的C#Windows窗体代码是错误的吗? 我调试时没有出现任何错误,但这并不意味着我没有忘记一些事情。 这是我的代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Threading; namespace CommunicateWithArduino { public partial class Form1 : Form { public static System.IO.Ports.SerialPort port; delegate void SetTextCallback(string text); private BackgroundWorker hardWorker; private Thread readThread = null; public Form1() { […]

SerialPort写缓冲区的目的是什么?

从SerialPort对象外部来看,写缓冲区的大小以及它是否已满是没有区别的。 使用同步写入,write方法将阻塞,直到所有数据都已发送且缓冲区为空。 使用异步写入,数据排队,程序继续运行。 在写操作完成且数据超出缓冲区之前,不会调用回调方法。 无论缓冲区中有多少数据以及缓冲区是否已满,serialport对象的行为似乎都是相同的。 写缓冲区已满时,似乎没有错误发生。 那么,为什么能够检查BytesToWrite和WriteBufferSize呢? 当写缓冲区已满时,SerialPort是否有任何不同的行为方式?

SerialPort.Open()抛出IOException – 没有足够的系统资源来完成所请求的服务

我有一个.NET 4 Windows服务,我写的是定期(通常每天一次)通过串口与外部设备通信。 总而言之,这项服务非常有用,但对于一个客户, SerialPort.Open()调用SerialPort.Open()会引发以下exception: System.IO.IOException:存在不足的系统资源来完成所请求的服务。 在System.IO.Ports.InternalResources.WinIOError(Int32 errorCode,String str) at System.IO.Ports.SerialStream..ctor(String portName,Int32 baudRate,奇偶校验,Int32 dataBits,StopBits stopBits,Int32 readTimeout,Int32 writeTimeout,握手握手,Boolean dtrEnable,Boolean rtsEnable,Boolean discardNull,Byte parityReplace) 在System.IO.Ports.SerialPort.Open() 基于exception,会认为服务器资源不足,但似乎并非如此。 CPU或多或少是空闲的,并且有足够的内存和磁盘。 有很多网上提到的SerialPort.Open()抛出其他IOExceptions,我已经实现了Zach Saw的SerialPortFixer ,但它似乎修复了一个不同的问题。 这是我正在做的事情的一个例子(大大简化)。 此类的几个实例(使用不同的串行端口名称)始终在内存中,然后每个实例大约每天调用一次Run()方法。 public class Collector { private SerialPort _port; private string _portName; public void Run() { try { // Run Zach Saw’s IOException workaround SerialPortFixer.Execute(_portName); using (_port = […]

当事件被引发一次时,多次调用c#事件处理程序

下面是我的代码,首先是我提出事件的地方,第二部分是我在另一个类中使用它的地方。 它看起来很简单,但是日志显示即使事件被提升一次,事件也会在消耗此事件的类上触发20次以上。 有任何想法吗? IBSerialPort类: public delegate void PacketReceivedHandler(object sender, PacketReceivedEventArgs e); public event PacketReceivedHandler OnPacketReceived; public class PacketReceivedEventArgs : EventArgs { public Packet PacketReceived { get; private set; } public PacketReceivedEventArgs(Packet packet) { PacketReceived = packet; } } // raise event if (OnPacketReceived != null) { Log(“This is only called ONCE!”); PacketReceivedEventArgs args = new […]

从bluetoothdevice获取错误的串口名称(c#)

要从系统中获取所有可用的串行端口,请使用以下命令。 SerialPort.GetPortNames 它适用于主板串口,但使用蓝牙设备我得到了错误的端口名。 例如:有时COM70或COM7ö代替COM7。 它总是1个字母。 任何建议? PS:我在Windows 7 PPS中使用最新的Visual Studio Express:切断最后一个字母的脏黑客不起作用,因为我不知道哪一个是蓝牙串口(有各种蓝牙键或设备,它改变了数量尝试各种棍子后,我到达COM10,ergo COM100或COM10f 编辑:我正在使用的代码。 阅读regestry,但仍然是同样的问题。 RegistryKey myRegistry = Registry.LocalMachine.OpenSubKey(“Hardware\\DeviceMap\\SerialComm”); foreach (string valuename in myRegistry.GetValueNames()) { if (myRegistry.GetValue(valuename) is String) { if (valuename.Contains(“BthModem”)) { richTextBox1.AppendText(“>” + myRegistry.GetValue(valuename) + “<" + Environment.NewLine); } } } 通常,第二个或第三个请求正在使用类似的结果 COM11ᯋ<COM10S <COM11 <COM10 <COM11 <COM10 < 怎么可能?

从C#中的串口读取和写入,第2部分

我正在尝试用C#替换C程序。 C程序通过COM1串行端口连接到较旧的计算机。 我没有关于C代码如何连接到其他机器的任何信息,但它确实连接正确,所以我必须猜测它是如何做到的。 我一直在使用Portmon来试图找出C程序如何成功编写和阅读。 我的新C#应用程序运行时,我也一直在运行Portmon。 在我的C#程序中,我使用的是SerialPort类。 我试图通过在工作程序上使用Portmon的输出来确定SerialPort类中的不同项应该具有的值。 我的想法是,如果我能够为类获得正确的值,它将正确地写入和读取。 程序(如下)无法正常工作。 该程序成功打开COM1端口,但在尝试写入句点(然后是另一个句点)时失败。 这些超时。 查看运行在旧C程序后面的Portmon的输出,工作程序打开COM1端口,然后在从COM1端口读取成功值(&OK)之前写入一个句点然后再写入另一个句点。 旧程序设置了几个我想在C#程序中复制的值。 我已经尝试了下面的SerialPort选项的各种组合,但我显然没有碰到任何东西。 顺便说一句,我在Stack Overflow问题中提出了一些初步问题。 从C#中的串口读取和写入,第2部分 我在运行程序的机器上使用Windows XP。 COM1端口另一侧的机器是一台非常旧的PC。 有一个更好的方法吗? 使用Portmon以外的东西? 对于旧程序的Portmon输出,Process列为ntvdm.exe。 那是问题吗? 我不应该使用C#SerialPort类吗? 可能最重要的问题是:我应该使用什么值来使Serialport类与旧程序匹配? 我的C#程序: SerialPort comport = new SerialPort(); comport.BaudRate = 9600; comport.DataBits = 7; comport.StopBits = StopBits.One; comport.Parity = Parity.Odd; comport.RtsEnable = true; comport.DtrEnable = true; comport.Handshake = Handshake.RequestToSend; comport.ReadBufferSize = […]

使用JavaScript与浏览器进行C#通信

如何从JavaScript传递消息到C#应用程序,我可以用c#中的PHP和tcpListner(但使用PHP需要服务器来托管),我需要localhost与浏览器通信c#应用程序(使用javaScript或任何其他可能的方式) ,浏览器需要将消息传递给在同一个matchine上运行的应用程序 你能用样品建议适当的方法吗?