C# serialport类串口通信问题

liuzhijingquan 2013-01-01 04:04:18
最近买了一个设备,是USB接口的,插到电脑上为虚拟串口com3。利用serialport类编写了串口读写功能,但程序始终无法进入DataReceive事件。利用portmon软件监测,当设备自带软件发送特定指令时,会收到数据。为什么我编的软件就是读取不到数据,跪求大家指导!谢谢,在线等~~~
...全文
1495 24 打赏 收藏 转发到动态 举报
写回复
用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去显示结果
  • 打赏
  • 举报
回复
可以用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)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧