C#串口通讯接收不到数据 我用C#写的串口通讯软件,串口通讯类用的是.Net的SerialPort类。不知道为什么,同样的操作,有时候PDA发送的数据能够接收到,有时候接收不到。而以前别人用Delphi写的串口通讯软件都能和PDA正常通讯。(和我现在做的这个功能一模一样,也是与PDA通讯)并且我们的串口参数:波特率等都设置的一样。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我以前GOOGLE到的代码:using System.IO.ports;SerialPort myPort = new SerialPort(); //初始化端口:myPort.PortName = "com1"; //端口名myPort.BaudRate = 115200; //速率myPort.DataBits = 8; //数据位 myPort.StopBits = StopBits.One; //停止位myPort.Parity = Parity.None; //奇偶校验myPort.RtsEnable = true; // 打开RTS ,这步很重要//下面这个方法将在指定的时间内接收串口数据并写入二进制文件。public void getRawData(SerialPort port, string fileName, int seconds){ FileStream f1; try { port.open(); // 打开端口 } catch (Exception err) { Console.WriteLine(err.ToString()); //端口打开失败,返回 return; } try { f1 = new FileStream(fileName, FileMode.Append); } catch (Exception err) { Console.WriteLine(err.ToString()); //文件打开失败,返回 return; } Console.WriteLine("Data will be logged from " + port.PortName + " for " + seconds + " seconds..."); BinaryWriter b1 = new BinaryWriter(f1); DateTime now = DateTime.Now; // 获取当前系统时间 while (((TimeSpan)(DateTime.Now - now)).TotalSeconds < seconds) 检测当前时间是否到了指定结束时间长度 { b1.Write((byte)port.ReadByte()); //写串口数据到文件 } b1.Close(); f1.Close(); port.Close();} PDA的AT命令应该不太一样吧,看看AT命令参考。 串口通信的特点就是不可靠,很可能不定时的才能填满接收缓冲区。1. 要么分成很小的包,连续发送,接收处理。(程序设计方面)2. 你说的可能不是接收不到,虽然触发了接收事件,但是数据只过来了一部分。假设在接收事件中,触发了事件,你不能马上提取数据处理, 做一个小的延时,500-1000 毫秒,这样效果会更好,缓冲区会填冲更多数据,可以提高接收完整的比率。建议,在发送端给流加上crc验证,接收端加上延时和crc验证包完整度,这样的通信更可靠,更准确。 如果连接都没有问题的话,应该就是数据接收不完全,需要延迟接收,建议使用SerialPort 试试 .net compact的串口操作有问题,用opennetcf或者自己写咯,用P/Invoke调用CreateFile这些函数 SerialPort类有一个接收数据的事件DataReceived,触发这个事件时,再去读取数据。读不到数据也可能是缓存区没有及时清理的问题。 这是做串口设备时的解决办法,不知道对你的问题有没有帮助。 myPort.RtsEnable = true; // 打开RTS ,这步很重要我的RtsEnable 默认是false,程序也没有改动,是不是这个问题? private void Form2_Load(object sender, EventArgs e) { try { //设置焦点在发送框 this.txtSend.Focus(); //设置发送框的光标位置 txtSend.SelectionStart = txtSend.Text.Length; txtSend.ScrollToCaret(); //加载端口参数配置 PortConfig.SetPortPara(spComPort); //打开串口连接 spComPort.Open(); } catch (Exception ex) { ShowMessageBox.Message_Information(ex.Message); } } #region 配置串口参数 /// <summary> /// 配置串口参数 /// </summary> /// <param name="spPort"></param> public static void SetPortPara(SerialPort com) { try { //串口连接的奇偶校验位 setParity(com); //串口连接的停止位数 setStopBits(com); //串口连接的流控制 setHandshake(com); //数据位 setDataBits(com); //波特率 setBaudRate(com); //COM端口 setPortName(com); //com.ReadTimeout = 1000; //com.Encoding = Encoding.GetEncoding("gb2312"); } catch (Exception ex) { throw ex; } } /// <summary> /// 接收数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { //检查串口是否打开,若未则打开 if (spComPort.IsOpen == false) { spComPort.Open(); } //获取接收数据的字节数组 byte firstByte = Convert.ToByte(spComPort.ReadByte()); int bytesRead = spComPort.BytesToRead; byte[] byteData = new byte[bytesRead + 1]; byteData[0] = firstByte; for (int i = 1; i <= bytesRead; i++) { byteData[i] = Convert.ToByte(spComPort.ReadByte()); } //解析接收到得数据码 ResolveAcceptData(byteData); } catch (Exception ex) { ShowMessageBox.Message_Information(ex.Message); } } private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e){// 添加一个500 毫秒的延时thread.sleep(500);.........} 请问,winfrom打包,如何覆盖安装 使用C#开发DirectX9.0和.Net环境配置 C# 实现模拟LED显示 Flash显示C#新闻页面内容,怎么样在FLASH加链接传值。 c#与OPC通讯问题 请问!!! 生成PDF的时候想加入数字签名要怎么做呢 奇怪的调试错误信息.......... 恳请高手指点:ASP.NET里使用强名称Excel组件的权限问题 有没有办法把C#项目做成硬盘版? 请各位大侠推荐一个.NET平台中能代替GDI+的图像处理库 两表关联显示数据的问题
myPort.PortName = "com1"; //端口名
myPort.BaudRate = 115200; //速率
myPort.DataBits = 8; //数据位
myPort.StopBits = StopBits.One; //停止位
myPort.Parity = Parity.None; //奇偶校验
myPort.RtsEnable = true; // 打开RTS ,这步很重要//下面这个方法将在指定的时间内接收串口数据并写入二进制文件。public void getRawData(SerialPort port, string fileName, int seconds)
{
FileStream f1;
try
{
port.open(); // 打开端口
}
catch (Exception err)
{
Console.WriteLine(err.ToString()); //端口打开失败,返回
return;
}
try
{
f1 = new FileStream(fileName, FileMode.Append);
}
catch (Exception err)
{
Console.WriteLine(err.ToString()); //文件打开失败,返回
return;
}
Console.WriteLine("Data will be logged from " + port.PortName + " for " + seconds + " seconds...");
BinaryWriter b1 = new BinaryWriter(f1);
DateTime now = DateTime.Now; // 获取当前系统时间
while (((TimeSpan)(DateTime.Now - now)).TotalSeconds < seconds) 检测当前时间是否到了指定结束时间长度
{
b1.Write((byte)port.ReadByte()); //写串口数据到文件
}
b1.Close();
f1.Close();
port.Close();
}
假设在接收事件中,触发了事件,你不能马上提取数据处理, 做一个小的延时,500-1000 毫秒,这样效果会更好,缓冲区会填冲更多数据,可以提高接收完整的比率。建议,在发送端给流加上crc验证,接收端加上延时和crc验证包完整度,这样的通信更可靠,更准确。
myPort.RtsEnable = true; // 打开RTS ,这步很重要
我的RtsEnable 默认是false,程序也没有改动,是不是这个问题?
private void Form2_Load(object sender, EventArgs e)
{
try
{ //设置焦点在发送框
this.txtSend.Focus();
//设置发送框的光标位置
txtSend.SelectionStart = txtSend.Text.Length;
txtSend.ScrollToCaret(); //加载端口参数配置
PortConfig.SetPortPara(spComPort);
//打开串口连接
spComPort.Open();
}
catch (Exception ex)
{
ShowMessageBox.Message_Information(ex.Message);
}
} #region 配置串口参数
/// <summary>
/// 配置串口参数
/// </summary>
/// <param name="spPort"></param>
public static void SetPortPara(SerialPort com)
{
try
{
//串口连接的奇偶校验位
setParity(com);
//串口连接的停止位数
setStopBits(com);
//串口连接的流控制
setHandshake(com);
//数据位
setDataBits(com);
//波特率
setBaudRate(com);
//COM端口
setPortName(com); //com.ReadTimeout = 1000;
//com.Encoding = Encoding.GetEncoding("gb2312");
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void spComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
//检查串口是否打开,若未则打开
if (spComPort.IsOpen == false)
{
spComPort.Open();
} //获取接收数据的字节数组
byte firstByte = Convert.ToByte(spComPort.ReadByte());
int bytesRead = spComPort.BytesToRead;
byte[] byteData = new byte[bytesRead + 1];
byteData[0] = firstByte;
for (int i = 1; i <= bytesRead; i++)
{
byteData[i] = Convert.ToByte(spComPort.ReadByte());
} //解析接收到得数据码
ResolveAcceptData(byteData);
}
catch (Exception ex)
{
ShowMessageBox.Message_Information(ex.Message);
}
}
{
// 添加一个500 毫秒的延时
thread.sleep(500);
...
...
...
}