上位机为delphi编写,控件使用spcomm
通过单片机向上位机串口发送数据,数据总长度为53,总是在第18位丢失一个字节 17(0x11),查看spcomm属性xOnChar的值为#17,怀疑和此值有关,但又不知道修改为和值。
于是找goole大神,说将
Outx_XonXoffFlow的属性设为false即可,果然如此。
顺便将搜到的一些宝贵资料贴出,以便查阅
- 目前我已经在1.2的版本中修复了一些错误,以及增加一些实用的功能。V1.1中的文件发送不能发送二进制文件,下面的可以
- procedure TFrmMain.SendFile(const FileName: string);
- var
- f: file;
- xfer: Integer;
- buf: PChar;
- BufSize: Integer;
- myFileSize: Integer;
- const
- CBUFSIZE = 1024;
- begin
- if not btnSend.Enabled then
- Exit;
- AssignFile(f, FileName);
- Reset(f, 1);
- myFileSize := FileSize(f);
- if myFileSize > CBUFSIZE then
- BufSize := CBUFSIZE
- else
- BufSize := myFileSize;
- GetMem(buf, BufSize);
- try
- {
- for xfer := 0 to BufSize-1 do
- buf[xfer] := #0;
- xfer := 0;
- }
- repeat
- BlockRead(f, buf^, BufSize, xfer);
- if xfer > 0 then
- begin
- Comm1.WriteCommData(buf, xfer);
- FTXNum := FTXNum + Cardinal(xfer);
- ShowTX;
- end;
- until xfer < BufSize;
- finally
- CloseFile(f);
- end;
- end;
- xielihong 26887 2006-10-28 12:08:26
- 同时,将Comm1的属性修改如下,可以避免出现字节丢失现象(带星号的是要修改的)
- object Comm1: TComm
- CommName = 'COM2'
- BaudRate = 9600
- ParityCheck = False
- Outx_CtsFlow = False
- Outx_DsrFlow = False
- DtrControl = DtrDisable *
- DsrSensitivity = False
- TxContinueOnXoff = False *
- Outx_XonXoffFlow = False *
- Inx_XonXoffFlow = False *
- ReplaceWhenParityError = False
- IgnoreNullChar = False
- RtsControl = RtsDisable *
- XonLimit = 500
- XoffLimit = 500
- ByteSize = _8
- Parity = None
- StopBits = _1
- XonChar = #17
- XoffChar = #19
- ReplacedChar = #0
- ReadIntervalTimeout = 100
- ReadTotalTimeoutMultiplier = 0
- ReadTotalTimeoutConstant = 0
- WriteTotalTimeoutMultiplier = 0
- WriteTotalTimeoutConstant = 0
- OnReceiveData = Comm1ReceiveData
- Left = 200
- Top = 152
- end
- xielihong 26888 2006-10-28 12:20:12
- 支持单行发送
- procedure TFrmMain.Memo2KeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- var
- LineNum: Longint;
- begin
- if not btnSend.Enabled then
- Exit;
- //快捷键 ALT + A all 发送发送区中的所有内容
- if (Shift = [ssAlt]) and (key = Ord('A')) then
- btnSend.Click;
- // 快捷键 ALT + S single 发送发送区中当前行的内容
- if (Shift = [ssAlt]) and (key = Ord('S')) then
- begin
- LineNum := SendMessage(Memo2.Handle, EM_LINEFROMCHAR, Memo2.SelStart, 0);
- if cbsendHex.Checked then
- SendString(HexStrToStr(Memo2.Lines[LineNum]))
- else
- SendString(Memo2.Lines[LineNum]);
- end;
- //快捷键 ALT + D 发送发送区中当前行的内容,并加上"回车换行"符
- if (Shift = [ssAlt]) and (key = Ord('D')) then
- begin
- LineNum := SendMessage(Memo2.Handle, EM_LINEFROMCHAR, Memo2.SelStart, 0);
- if cbsendHex.Checked then
- SendString(HexStrToStr(Memo2.Lines[LineNum] + #13#10))
- else
- SendString(Memo2.Lines[LineNum] + #13#10);
- end;
- end;