spcomm数据丢失解决方法

上位机为delphi编写,控件使用spcomm
通过单片机向上位机串口发送数据,数据总长度为53,总是在第18位丢失一个字节 17(0x11),查看spcomm属性xOnChar的值为#17,怀疑和此值有关,但又不知道修改为和值。
于是找goole大神,说将 Outx_XonXoffFlow的属性设为false即可,果然如此。

顺便将搜到的一些宝贵资料贴出,以便查阅

  1. 目前我已经在1.2的版本中修复了一些错误,以及增加一些实用的功能。V1.1中的文件发送不能发送二进制文件,下面的可以
  2. procedure TFrmMain.SendFile(const FileName: string);
  3. var
  4.   f: file;
  5.   xfer: Integer;
  6.   buf: PChar;
  7.   BufSize: Integer;
  8.   myFileSize: Integer;
  9. const  
  10.   CBUFSIZE = 1024;
  11. begin
  12.   if not btnSend.Enabled then 
  13.     Exit;
  14.   AssignFile(f, FileName);
  15.   Reset(f, 1);
  16.   myFileSize := FileSize(f);
  17.   if myFileSize > CBUFSIZE then  
  18.     BufSize := CBUFSIZE
  19.   else  
  20.     BufSize := myFileSize;
  21.   GetMem(buf, BufSize);
  22.   try
  23.   {
  24.   for xfer := 0 to BufSize-1 do
  25.     buf[xfer] := #0;
  26.   xfer := 0;
  27.   }
  28.     repeat
  29.       BlockRead(f, buf^, BufSize, xfer);
  30.       if xfer > 0 then
  31.       begin
  32.         Comm1.WriteCommData(buf, xfer);
  33.         FTXNum := FTXNum + Cardinal(xfer);
  34.         ShowTX;
  35.       end;
  36.     until xfer < BufSize;
  37.   finally
  38.     CloseFile(f);
  39.   end;
  40. end;
  41. xielihong 26887 2006-10-28 12:08:26
  42. 同时,将Comm1的属性修改如下,可以避免出现字节丢失现象(带星号的是要修改的)
  43. object Comm1: TComm
  44.     CommName = 'COM2'
  45.     BaudRate = 9600
  46.     ParityCheck = False
  47.     Outx_CtsFlow = False
  48.     Outx_DsrFlow = False
  49.     DtrControl = DtrDisable  *
  50.     DsrSensitivity = False
  51.     TxContinueOnXoff = False  *
  52.     Outx_XonXoffFlow = False  *
  53.     Inx_XonXoffFlow = False  *
  54.     ReplaceWhenParityError = False
  55.     IgnoreNullChar = False
  56.     RtsControl = RtsDisable  *
  57.     XonLimit = 500
  58.     XoffLimit = 500
  59.     ByteSize = _8
  60.     Parity = None
  61.     StopBits = _1
  62.     XonChar = #17
  63.     XoffChar = #19
  64.     ReplacedChar = #0
  65.     ReadIntervalTimeout = 100
  66.     ReadTotalTimeoutMultiplier = 0
  67.     ReadTotalTimeoutConstant = 0
  68.     WriteTotalTimeoutMultiplier = 0
  69.     WriteTotalTimeoutConstant = 0
  70.     OnReceiveData = Comm1ReceiveData
  71.     Left = 200
  72.     Top = 152
  73.   end
  74. xielihong 26888 2006-10-28 12:20:12
  75. 支持单行发送
  76. procedure TFrmMain.Memo2KeyDown(Sender: TObject; var Key: Word;
  77.   Shift: TShiftState);  
  78. var 
  79.   LineNum: Longint;
  80. begin
  81.   if not btnSend.Enabled then 
  82.     Exit;
  83.   //快捷键 ALT + A   all    发送发送区中的所有内容
  84.   if (Shift = [ssAlt]) and (key = Ord('A')) then
  85.     btnSend.Click;
  86.   // 快捷键 ALT + S   single    发送发送区中当前行的内容
  87.   if (Shift = [ssAlt]) and (key = Ord('S')) then
  88.   begin
  89.     LineNum := SendMessage(Memo2.Handle, EM_LINEFROMCHAR, Memo2.SelStart, 0);
  90.     if cbsendHex.Checked then
  91.       SendString(HexStrToStr(Memo2.Lines[LineNum]))
  92.     else
  93.       SendString(Memo2.Lines[LineNum]);
  94.   end;
  95.   //快捷键 ALT + D      发送发送区中当前行的内容,并加上"回车换行"符
  96.   if (Shift = [ssAlt]) and (key = Ord('D')) then
  97.   begin
  98.     LineNum := SendMessage(Memo2.Handle, EM_LINEFROMCHAR, Memo2.SelStart, 0);
  99.     if cbsendHex.Checked then
  100.       SendString(HexStrToStr(Memo2.Lines[LineNum] + #13#10))
  101.     else
  102.       SendString(Memo2.Lines[LineNum] + #13#10);
  103.   end;
  104. end;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值