C#读串口的数据,读不全的问题 不懂的千万别说话!

你好,我也碰到你说的类似的问题,就是读com口的数据,读不全的问题,我是用:sp.ReadExisting();读取的。有时候可以读全,有时候不行,总是找不到原因。有原程... 你好,我也碰到你说的类似的问题,就是读com口的数据,读不全的问题,我是用:
sp.ReadExisting(); 读取的。有时候可以读全,有时候不行,总是找不到原因。
有原程序吗?我参考一下,急。
不懂的朋友,千万别说话,默默的看着吧!谢谢了!
展开
 我来答
rightmin
2011-08-23 · TA获得超过4124个赞
知道大有可为答主
回答量:2199
采纳率:0%
帮助的人:1799万
展开全部
没遇到你说的问题,串口组件搜到数据后,会触发一个事件,在这个事件里面获取数据的长度,一次取出来,放到缓冲区里面。

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] buff = new byte[serialPort1.BytesToRead];
serialPort1.Read(buff, 0, buff.Length);
//之后buff里面就是串口接受的数据了,这个时候需要尽快处理掉,
//串口缓冲区会被塞满数据导致数据丢失
//假如对数据的处理很复杂,很慢,建议把buff扔到一个缓冲区里面
//并使用另外的一个线程去处理数据,而不是直接在serialPort1_DataReceived这个
//事件响应方法里面处理
}
迪凯特科技(北京)有限公司
2023-07-28 广告
RS232串行通讯的数据格式包括以下组成部分:1. 起始位:一位,用于表示数据的开始。2. 数据位:通常为8位,但也可以是7位或9位。3. 校验位:可以选择奇偶校验或无校验。4. 停止位:一位,用于表示数据的结束,也可以选择使用1.5个或2... 点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
不想起名字了2333
2011-08-23 · TA获得超过2447个赞
知道大有可为答主
回答量:1931
采纳率:50%
帮助的人:1854万
展开全部
//发送
private void send_Click(object sender, EventArgs e)
{
byte[] data = ASCIIEncoding.GetEncoding("gb2312").GetBytes(sdtext.Text.Trim());
if (mycomm.IsOpen)
{
mycomm.Write(data,0,data.Length);
mycomm.WriteLine("\r");
}
}

//接收
/*用while循环处理,先读取缓冲区的数据字节数sum,
之后每次读取k个字节的数据,直道k==sum为止*/

private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength) /* 这是重点 */
{
byte[] dbs = new byte[2048];
int len = mycomm.Read(dbs,0,2048);
//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len; /* 这是重点 */
}
revtext.Text += strb; //revtext.Text 用来显示读取到的数据
}
追问
读取2048个字节  你不累吗?
等处理完2045个字节 数据又变了。。
追答
你可以结合楼上说的啊,向串口写数据是时定义个缓冲时间,比如:
向串口写500字节的数据,暂停T时间,假设T=700ms(或者1s或者2s), T时间之后再向串口写数据;
而你读取数据的时候 每次接受200个字节(2045个字节很大吗?),直道把缓冲区数据全部读取, 这个读取、处理 缓冲区所有数据的总时间 可以有向串口写数据的间隔时间T决定~~~

比如 向串口写1000字节要0.1ms,而读取200字节要0.04ms,处理1000字节的时间为0.3ms,
那么 读取缓冲区的1000字节所要的时间为 0.04 * (1000/200 ) =0.2ms
那么 你可以定义 T = ( 0.1ms+0.2ms + 0.3ms )
也就是每隔0.6ms向串口缓冲区写一次数据,写的数据大小为1000字节~~~~~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
houyuansen
2011-08-26
知道答主
回答量:28
采纳率:0%
帮助的人:13万
展开全部
我曾经也遇到这样的问题,发命令出去后接收不全,下面是我的代码。
缓存有数据就接收,等待500毫秒,再查看缓存,如此循。
我也才接触串口,老鸟勿喷,相互学习。
try
{
while (Com.BytesToRead != 0)
{
int nums = Com.BytesToRead;
byte[] receBuf = new byte[nums];
Com.Read(receBuf, 0, nums);
Com.DiscardInBuffer();
Thread.Sleep(500);//这个等待时间可以适当修改
result += ByteArrayToHexString(receBuf);//result是定义的string
}

Com.Close();

}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
Com.Close();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mportker
2011-08-23
知道答主
回答量:6
采纳率:100%
帮助的人:12.3万
展开全部
我有源程序,可以给你发一份,百度HI你了!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
战艺M
2011-08-23 · TA获得超过127个赞
知道答主
回答量:608
采纳率:0%
帮助的人:166万
展开全部
123
追问
没办法说你了!JIAN
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式