spcomm数据丢失解决方法

原创 2008年11月04日 16:19:00
上位机为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;

相关文章推荐

delphi char数组、string和Pchar的相互转换

http://blog.csdn.net/kunlun122/article/details/13773075 因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,...

mybatis数据类型错误及解决方法

  • 2016年06月20日 15:36
  • 276B
  • 下载

在Delphi环境下基于SPCOMM控件开发串口通讯报文字节丢失的问题解决

最近做的工具需要直接与下位机进行HEXs

Linux系统下串口接收数据,部分特殊字符丢失的解决方法 .

最近在linux系统中写了个串口接收程序,发送端依次从0x00~0xFF发送字符,但接收端某些字符老接收不到,分析及其解决方法如下: 一、只接收到数据: 05 06 07 08 09 0a...

数据结构 约瑟夫环的解决方法

  • 2010年11月18日 15:08
  • 2KB
  • 下载

C#串口通信时丢失数据的一种解决方法

C#串口通信时丢失数据的一种解决方法 刘凯 周云耀 武汉理工大学信息工程学院 武汉市(430070) E-mail:lk.6@163.com 摘要:C # 串行类( SerialPort )是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spcomm数据丢失解决方法
举报原因:
原因补充:

(最多只允许输入30个字)