Delphi MSCOMM 接受会掉数据?? 求助!!!【恢复】
procedure TForm2.FormCreate(Sender: TObject);begin
if MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口
Mscomm1.CommPort:=strtoint(ComboBox1.Text);
MSComm1.InBufferSize := 1024;//设置接收缓冲区为1024个字节
MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节
MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位
MSComm1.InputLen := 0;//读取缓冲区全部内容(2个字节)
MSComm1.InBufferCount := 0;// 清除接收缓冲区
MSComm1.OutBufferCount:=0;// 清除发送缓冲区
MSComm1.RThreshold := 1;//设置接收1个字节产生OnComm 事件
// MSComm1.InputMode := comInputModeText;//文本方式
MSComm1.InputMode := comInputModeBinary;//二进制方式
//Mscomm1.PortOpen:=true;
end;
procedure Ttest.MSComm1Comm(Sender: TObject);
var
xtemp:olevariant;
sbuff:array of byte;
i,j:integer;
xRecData:string;
begin
i:=mscomm1.InBufferCount;
if i=0 then
exit;
if mscomm1.CommEvent=2 then
begin
xtemp:=mscomm1.Input;
MSComm1.InBufferCount := 0;// 清除接收缓冲区
setlength(sbuff,i);
sbuff:=xtemp;
for j:=0 to i-1 do
begin
xRecData:=inttohex(sbuff,2);
memo1.Lines.Add(xrecdata);
end;
end;
end;
单片机程序:
u8 i,j;
for(i=0;i<11;i++)
{
for(j=0;j<9;j++)
{
Send_data( j);
//delay_nms(5);
}
}
单片机每 5S调用一次上面的循环 连续发120个字节 会掉数据(用串口调试助手就不会漏), 用delay_nms(5); 就不会掉数据 单片机下我不想用delay_nms(5); 有什么方法解决吗? 谢谢! mscomm控件,你程序处理不好的话,都会丢数据的。 7楼,mscomm的缓冲区默认是1k,对数据来说是问题不大的,
8楼,API同样有这个问题,我碰到过
这种问题在主板集成的串口中出现不多,在usb转的串口里面出现比较多。
处理原理:当串口中断的时候,启动GetComData函数,在函数里面进行查询接收,超时后退出。超时时间请根据需要自己把握
处理办法:使用如下相关办法。注意:代码是VB代码,可能不如何规范,仅供参考
Private Function GetComData() As String
On Error GoTo DealError
Dim nTemp As Integer
Dim strTemp As String
Dim strRet As String
start0:
strTemp = COM.Input
strRet = strRet & strTemp
If strTemp = "" And nTemp>= 3 Then
nTemp = nTemp + 1
Sleep (20)
GoTo start0
Else
GoTo End0
End If
End0:
GetComData = strTemp
Exit Function
DealError:
WriteErrLog ("frmMain.GetComData " & Err.Description)
Exit Function
End Function 从古老的文件夹里抠了段出来
{*********************************
串口中断!! 按照
$FE xxx xxx xxx xxx $EF
的格式接收数据
***********************************}
procedure TForm1.MSComm1Comm(Sender: TObject);
var
SerialInput: Variant;
i: Integer;
InputLen: Integer;
begin
if MSComm1.CommEvent = 2 then
begin
InputLen := MSComm1.InBufferCount; //读入字节数计数
SerialInput := MSComm1.Input; //串口读入数据
for i := 0 to InputLen - 1 do
begin
if DataPtr = 0 then //如果还没有收到起始位
begin
if SerialInput = $FE then //判断是否是起始位
begin
Data := SerialInput;
//把接收到的数据放入接收缓冲区
DataPtr := DataPtr + 1; //指针++
end
else
begin
DataPtr := 0; //如果不是起始位,则ptr=0,继续等待起始位
end;
end
else if DataPtr < 4 then //判断是否接收够6位
begin
Data := SerialInput; //不够,继续把数据放入缓冲区
DataPtr := DataPtr + 1;
end
else if DataPtr = 4 then //如果收到6个数,
begin
if SerialInput = $EF then //判断是否是结束位
begin
Data := SerialInput;
//是,则把结束位送入缓冲,执行后续操作
RecvCnt := RecvCnt + 1; //收到包计数++
saveToCar();
dispCar();
end
else
begin
DataPtr := 0; //不是结束位,则ptr=0,继续等待起始位
end;
end
else
begin
DataPtr := 0; //缓冲区已满,清除缓冲继续等待
end;
end;
end;
end; 我不会delphi,我只会VB。不过处理原理都是一样的。 不应该啊。 你的波特率那么低,数据量也才120个。。。 zxq6 小马哈 能提供个上位机处理程序吗 非常感谢!
你试试这个行不行,很久以前编用spcomm的,只有接收测试了,发送没测,如果不好使,我也没办法了
点击此处下载 ourdev_419684.rar(文件大小:180K) (原文件名:test1.rar) 我只有接收的
后来都用api做了 源码
注意一下,我的数据显示方式也不是很好,是以行为单位的,所以有些闪动
你可以在优化下
点击此处下载 ourdev_419924.rar(文件大小:199K) (原文件名:porject-10.rar) ilymy 我测试可以 谢谢! 遗憾的是没源码!!!! 能提供源码吗 ?
本贴被 lin28 编辑过,最后修改时间:2008-09-17,08:37:10. 再次感谢ilymy 现在不漏数据了 我决定用SPCOMM了 SPCOMM你处理好显示,应该不会 可惜 不会用API ! 用SPCOMM会不会也漏数据呀? MSComm1.InBufferCount := 0;// 清除接收缓冲区
这句看不懂,注释掉试试
另外你用的数据显示方式太慢,相当于每一个字符都要刷一下memo,太慢了,优化一下吧 不行的话,用API重写下看看
理论上不存在任何问题啊。。。 发送数据不能连续大量的发,mscomm控件的缓冲区是有一定大小的 应该跟波特率关系不大, 我用19200 4800 也丢数据, 加入delay_nms(5); 就没问题 , 好像PC机处理不过来! 我是用USB转串口的, 可是我用串口调试助手 不用加入delay_nms(5); 也正常啊 所以只能怀疑PC的程序了 难道MSCOMM真的想传说中的会漏数据吗? 郁闷。。。。 不喜欢用控件,最好用api spcomm 默认是开软件流控的 设置好了一般都不会有什么问题 我都一直用mscomm,没有出现丢数据情况。 好 非常感谢各位 我自己努力试下 ilymy
能给个SPCOMM 向单片机能发0Xad(大于128)的 程序吗 谢谢 串口接收事件实际上是一个定时器,所以你要设置好发送超时和接收超时时间,还有就是数据读取回来后处理程序要适当 mark delephi怎么调用VB谢谢程序
对VB的文本框text combo command
进行调用,谢谢各位啊
页:
[1]