社区
C#
帖子详情
C# serialport类串口通信问题
liuzhijingquan
2013-01-01 04:04:18
最近买了一个设备,是USB接口的,插到电脑上为虚拟串口com3。利用serialport类编写了串口读写功能,但程序始终无法进入DataReceive事件。利用portmon软件监测,当设备自带软件发送特定指令时,会收到数据。为什么我编的软件就是读取不到数据,跪求大家指导!谢谢,在线等~~~
...全文
1495
24
打赏
收藏
C# serialport类串口通信问题
最近买了一个设备,是USB接口的,插到电脑上为虚拟串口com3。利用serialport类编写了串口读写功能,但程序始终无法进入DataReceive事件。利用portmon软件监测,当设备自带软件发送特定指令时,会收到数据。为什么我编的软件就是读取不到数据,跪求大家指导!谢谢,在线等~~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yangchao4121
2015-06-01
打赏
举报
回复
port1.RtsEnable = false; port1.DtrEnable = false; 改为true
Mr.Bai.
2014-10-11
打赏
举报
回复
怎么解决的,能否告知一下呢?
anribras
2013-12-10
打赏
举报
回复
引用 19 楼 liuzhijingquan 的回复:
问题已经初步解决,谢谢大家!
如何解决的 啊?遇到差不多的问题了
lt465349176
2013-10-22
打赏
举报
回复
需要使用invoke 进行托管
wdyrobot
2013-04-23
打赏
举报
回复
怎么解决的,能否详细说说?
liuzhijingquan
2013-01-04
打赏
举报
回复
问题已经初步解决,谢谢大家!
yuxiaodong790909
2013-01-04
打赏
举报
回复
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (e.EventType != SerialData.Chars) return; if (sp.BytesToRead <= 0) return; byte[] ReadBuf = new byte[sp.BytesToRead]; sp.Read(ReadBuf, 0, ReadBuf.Length); //接收数据 lock(queMsgs) queMsgs.Enqueue(ReadBuf); PostMessage(this.handler, MsgId, 0, 0); }
zhpfaff
2013-01-04
打赏
举报
回复
port1_DataReceived 的问题,你要看你接收的是字符串还是16进制的数据,加一个选项设置一下,比如起名叫协议,当为字符串时用ReadExisting(),然后做处理, 否则为16进制的数据,用Read(readBuffer, 0, readBuffer.Length),然后处理 最后用BeginInvoke去显示结果
一条路坚持下去
2013-01-04
打赏
举报
回复
可以用232、485看看是否发送了指令,也许你用的读取方式不对,有ASCLL和十六进制读取方式,你要哪种方式读取
知擎物联
2013-01-03
打赏
举报
回复
你用我这个C#带源码的串口调试工具调试下看看,收发数据情况。 http://download.csdn.net/detail/yeqi3000/4853494
liuzhijingquan
2013-01-03
打赏
举报
回复
谢谢大家,物理串口是com3,我试了很多串口调试工具,也看了很多串口调试的源码,但还是接收不到数据,怀疑是不是因为没有执行GET_MODEMSTATUS和GET_MODEMSTATUS操作,发送的指令应该是对的,就是没反应
liuzhijingquan
2013-01-02
打赏
举报
回复
不好意思,忘了把这行注释掉。我开始是轮询的方式去读,最初用得这个 port1.ReadExisting(),发现读到的是空,就注释掉,改用下面的read函数,结果还是空。现在用事件触发的方式,根本进不去,也就不会执行这两个读的函数。不知道为什么,郁闷,呵呵
yemuzi
2013-01-02
打赏
举报
回复
论坛牛人就是多,学习了
缭绕飘渺
2013-01-02
打赏
举报
回复
port1_DataReceived这个有问题 string str = port1.ReadExisting();这个已经把数据全读完了 你下面就读取不到了 port1.Read(readBuffer, 0, readBuffer.Length);就是这个读取已经没数据了
vpjian
2013-01-02
打赏
举报
回复
如果其它软件可以正常使用,硬件就应该是没问题的。你的程序不能通信,可能是因为对端需要流控制,而你没有设置相关参数而已,将DtrEnable RtsEnable两个参数设置为true吧。 另外接收函数中不要使用sleep,不要操作界面,不要执行长时间的运算,只将数据保存到缓冲区就好了,使用另一个线程(或者异步)处理数据,否则会莫名奇妙的丢数据。
缭绕飘渺
2013-01-02
打赏
举报
回复
首先用串口助手或者超级终端调通 再调试你的程序
缭绕飘渺
2013-01-02
打赏
举报
回复
没看出其他问题来 看下物理串口是不是COM3 试试直接发送字符串,不要写字节数组
liuzhijingquan
2013-01-01
打赏
举报
回复
定义的是SerialPort port1 = new SerialPort(PortName);
绑定事件port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived)
下面是用portmon抓原有程序的结果:
IRP_MJ_CREATE USBSER000 SUCCESS Options: Open
IOCTL_SERIAL_SET_QUEUE_SIZE USBSER000 SUCCESS InSize: 8192 OutSize: 1024
IOCTL_SERIAL_GET_BAUD_RATE USBSER000 SUCCESS
IOCTL_SERIAL_GET_LINE_CONTROL USBSER000 SUCCESS
IOCTL_SERIAL_GET_CHARS USBSER000 SUCCESS
5IOCTL_SERIAL_GET_HANDFLOW USBSER000 SUCCESS
IOCTL_SERIAL_SET_BAUD_RATE USBSER000 SUCCESS Rate: 115200
IOCTL_SERIAL_CLR_RTS USBSER000 SUCCESS
IOCTL_SERIAL_CLR_DTR USBSER000 SUCCESS
IOCTL_SERIAL_SET_LINE_CONTROL USBSER000 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR USBSER000 SUCCESS EOF:8c ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW USBSER000 SUCCESS Shake:0 Replace:0 XonLimit:2048 XoffLimit:2048
IOCTL_SERIAL_SET_TIMEOUTS USBSER000 SUCCESS RI:-1 RM:0 RC:100 WM:100 WC:1000
IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL
IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS
IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS
IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS
IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: TXCLEAR RXCLEAR
IRP_MJ_WRITE USBSER000 SUCCESS Length 1: ?
IRP_MJ_READ USBSER000 TIMEOUT Length 0:
IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
23 0.00000049 adsbscope25_256 IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: TXCLEAR RXCLEAR
IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: TXCLEAR RXCLEAR
IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: TXCLEAR RXCLEAR
IRP_MJ_WRITE USBSER000 SUCCESS Length 5: #00-.
IRP_MJ_READ USBSER000 SUCCESS Length 50: #00-00-09-04-00-00-00-00-00-00-00-00-00-00-00-00-.
IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
源码如下:
private void Form1_Load(object sender, EventArgs e)
{
InitCOM("COM3");
OpenPort();
}
public void InitCOM(string PortName)
{
port1 = new SerialPort(PortName);
port1.NewLine = "\r\n";
port1.ReadBufferSize = 8192;
port1.WriteBufferSize = 1024;
port1.BaudRate = 152000;//波特率
port1.Parity = Parity.None;//无奇偶校验位
port1.StopBits = StopBits.One;//两个停止位8
port1.DataBits = 8;
port1.Handshake = Handshake.None;
port1.RtsEnable = false;
port1.DtrEnable = false;
port1.ReceivedBytesThreshold = 1;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
port1.WriteTimeout = 1000;
port1.ReadTimeout = 100;
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象
port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);//DataReceived事件委托
}
//打开串口的方法
private void OpenPort()
{
try
{
port1.Open();
}
catch { }
if (!port1.IsOpen)
{
MessageBox.Show("端口打开失败");
}
}
//关闭串口的方法
public void ClosePort()
{
port1.Close();
if (!port1.IsOpen)
{
MessageBox.Show("端口关闭成功");
}
}
private void button1_Click(object sender, EventArgs e)
{
port1.DiscardInBuffer(); //清除接收缓冲区
port1.DiscardOutBuffer();
Senddata(textBox1.Text);
//this.Invoke(interfaceUpdateHandle, new string[] { "发送数据(" + textBox1.Text.Length + "):" + textBox1.Text + "\r\n" });
textBox_data.AppendText("发送数据(" + textBox1.Text.Length + "):" + textBox1.Text + "\r\n");
}
//向串口发送数据
public void Senddata(string data)
{
byte[] WriteBuffer = Encoding.ASCII.GetBytes(data);
port1.Write(WriteBuffer, 0, WriteBuffer.Length);
}
public void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(1000);
try
{
string str = port1.ReadExisting();
int n = port1.BytesToRead;
byte[] readBuffer = new byte[port1.ReadBufferSize];
port1.Read(readBuffer, 0, readBuffer.Length);
if (readBuffer.Length > 0)
{
textBox_data.AppendText("接收到数据包:\r\n" + dis_package(readBuffer) + "\r\n");
//this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
}
else
{
MessageBox.Show("kong");
}
port1.DiscardInBuffer(); //清除接收缓冲区
port1.DiscardOutBuffer();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
//显示包信息
public string dis_package(byte[] reb)
{
string temp = "";
foreach (byte b in reb)
temp += b.ToString("X2") + " ";
return temp;
}
private void UpdateTextBox(string text)
{
textBox_data.Text = text;
}
抓包结果如下:
IRP_MJ_CREATE USBSER000 SUCCESS Options: Open
IOCTL_SERIAL_GET_PROPERTIES USBSER000 SUCCESS
IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS
IOCTL_SERIAL_GET_BAUD_RATE USBSER000 SUCCESS
IOCTL_SERIAL_GET_LINE_CONTROL USBSER000 SUCCESS
IOCTL_SERIAL_GET_CHARS USBSER000 SUCCESS
IOCTL_SERIAL_GET_HANDFLOW USBSER000 SUCCESS
IOCTL_SERIAL_GET_BAUD_RATE USBSER000 SUCCESS
IOCTL_SERIAL_GET_LINE_CONTROL USBSER000 SUCCESS
IOCTL_SERIAL_GET_CHARS USBSER000 SUCCESS
IOCTL_SERIAL_GET_HANDFLOW USBSER000 SUCCESS
IOCTL_SERIAL_SET_BAUD_RATE USBSER000 SUCCESS Rate: 152000
IOCTL_SERIAL_CLR_RTS USBSER000 SUCCESS
IOCTL_SERIAL_CLR_DTR USBSER000 SUCCESS
IOCTL_SERIAL_SET_LINE_CONTROL USBSER000 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR USBSER000 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW USBSER000 SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_GET_BAUD_RATE USBSER000 SUCCESS
IOCTL_SERIAL_GET_LINE_CONTROL USBSER000 SUCCESS
IOCTL_SERIAL_GET_CHARS USBSER000 SUCCESS
IOCTL_SERIAL_GET_HANDFLOW USBSER000 SUCCESS
IOCTL_SERIAL_SET_BAUD_RATE USBSER000 SUCCESS Rate: 152000
IOCTL_SERIAL_CLR_RTS USBSER000 SUCCESS
IOCTL_SERIAL_CLR_DTR USBSER000 SUCCESS
IOCTL_SERIAL_SET_LINE_CONTROL USBSER000 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR USBSER000 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW USBSER000 SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_CLR_DTR USBSER000 SUCCESS
IOCTL_SERIAL_SET_TIMEOUTS USBSER000 SUCCESS RI:-1 RM:-1 RC:100 WM:0 WC:1000
IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
IOCTL_SERIAL_SET_QUEUE_SIZE USBSER000 SUCCESS InSize: 8192 OutSize: 1024
IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: RXABORT RXCLEAR
IOCTL_SERIAL_PURGE USBSER000 SUCCESS Purge: TXABORT TXCLEAR
IRP_MJ_WRITE USBSER000 SUCCESS Length 5: #00-.
IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask:
个别参数不太一致,现在就是接受不到数据,求各位指教!
yuxianye1
2013-01-01
打赏
举报
回复
如何软件的设置和事件接收都像你说的没有问题,并且数据发送了,应该是能接收到的 另外usb转串口有时会出问题的,以前用的就是这样,有时收到有时收不到,后来换了一个就好了
devmiao
2013-01-01
打赏
举报
回复
用串口调试助手调试下,不行把代码贴出来看看。
加载更多回复(3)
C#
Se
ria
l
Port
类
串口通讯助手程序demo
本文件是基于
C#
Se
ria
l
Port
类
串口通讯助手程序,使用VS2013写的,里面有源程序代码。
C#
Se
ria
l
Port
类
串口通讯程序并绘制实时数据图
C#
基于
Se
ria
l
Port
类
串口通讯程序,可以接受数据并实时绘制数据图。很好的例子。
C#
上位机串口编程、Modbus编程
WinForm框架 是 Windows Form 的简称,是美国微软公司Microsoft开发基于 .NET Framework 平台的桌面运用程序框架,一般使用
C#
语言 编写。WinForm框架可用于设计窗体和可视控件,采用面向对象语言
C#
,可快速创建绚丽漂亮的基于Windows的桌面应用程序、非常适合做上位机的界面! 串口(
Se
ria
l
Port
),也称串行通讯接口(通常指COM口),
串口通信
是指将数据一个比特一个比特地逐位进行传输的通信模式。
C#
串口通信
是借助一个
Se
ria
l
Port
类
的对象来方便的对串口进行读写。 Modbus是一种串行通信协议,是施耐德电气发表工业标准协议。
C#
NModbus4库提供了ModbusMaster、ModbusSlave
类
来实现Modbus通讯相关的功能 本课程主要帮助学员熟练掌握
C#
WinForm框架上位机串口编程,Modbus协议编程,并且通过两个实战工具项目,为学习
C#
WinForm上位机编程 串口、Modbus编程打下坚固的基础!
C#
se
ria
l
Port
控件串口通讯.zip
基于
C#
编程的串口通讯例程,使用自带控件
se
ria
l
Port
完成数据发送与接受,ini文件进行数据参数保存与加载。
C#
使用
Se
ria
l
Port
类
实现
串口通信
最近在学
C#
,在网上找了很多有关
串口通信
的资料,自己总结了一下,开发环境是VS2005,代码实现
C#
110,499
社区成员
642,566
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章