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;

SPComm的一点小诀窍 spcomm的问题导致数据丢失

最近几天完成了BiasDAC的程序编写。调试的过程还算比较顺利,除了几个有点bt的小问题。其中一个困扰了我两三天的时间,今天上午终于将其解决。 由于BiasDAC是用RS232 Serial P...
  • a6652162
  • a6652162
  • 2014年02月12日 15:00
  • 905

SPComm的一点小诀窍 spcomm的问题导致数据丢失 0x11与0x13错误

最近几天完成了BiasDAC的程序编写。调试的过程还算比较顺利,除了几个有点bt的小问题。其中一个困扰了我两三天的时间,今天上午终于将其解决。 由于BiasDAC是用RS232 Serial Por...
  • Tercel99
  • Tercel99
  • 2015年06月30日 06:59
  • 775

JS的浮点数计算精度丢失问题解决方案

近期在做项目的时候,遇到了一些JS浮点数精度的问题。这个问题,其实说大不大,说小不小。但是这次因为涉及到一些财务和结算的问题,然后突然发现这个小问题处理起来还是挺麻烦的。这里把相关的原因的问题的解决方...
  • u012143360
  • u012143360
  • 2016年11月13日 13:31
  • 2212

关于float和double丢失精度问题及解决方案

double result = 1.0 - 0.9; System.out.println(result);//0.09999999999999998 出现这种结果的原因:float和double类型...
  • Wanted_Tao
  • Wanted_Tao
  • 2016年10月21日 10:34
  • 2114

数据库-关于丢失更新和乐观锁的那些故事

1.问题场景 a. 用户A打开应用的界面,看到数据库的某条记录 b.用户B打开应用的界面,看到同样一条记录 c. 用户A对记录做了修改 d. 对于web应用而言[假设没有应用c...
  • z69183787
  • z69183787
  • 2016年08月16日 13:34
  • 1374

ALV导出数据到EXCEL时数据丢失位数的解决方法

  • 2016年06月22日 11:41
  • 30KB
  • 下载

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

最近做的工具需要直接与下位机进行HEXs
  • liushinhwa
  • liushinhwa
  • 2014年06月20日 10:48
  • 1049

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

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

oracle数据导出身份证明-用户名和口令-错误的解决方法

  • 2013年11月02日 16:41
  • 63KB
  • 下载

dataGridView1中汇总的解决方法dataset 数据汇总

  • 2009年03月19日 11:04
  • 621B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spcomm数据丢失解决方法
举报原因:
原因补充:

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