MSCOMM参数设置过程

本文介绍了在Delphi中使用MSCOMM组件进行串口通信时的参数设置过程和接收事件处理。在FormCreate事件中,设置了通信口参数、接收模式、缓冲区大小等,并通过Output属性发送串口命令。在MSComm1Comm事件中,处理接收到的数据,通过InBufferCount判断接收缓冲区状态,并逐字节读取,特别处理了0字符的情况以避免程序异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//以下是创建窗体时的MSCOMM参数设置过程

//MSComm1.InputMode := comInputModeBinary;

//和MSComm1.InputMode := comInputModeText;

//实验结果基本对Delghi不太起作用

procedure TForm1.FormCreate(Sender: TObject); var   str: string; begin //MSCOMM参数设置   MSComm1.CommPort := 1;//使用COM1   MSComm1.Settings := ''9600,N,8,1'';//设置通信口参数   MSComm1.InBufferSize := 32;//设置MSComm1接收缓冲区为32字节   MSComm1.OutBufferSize := 2;//设置MSComm1发送缓冲区为2字节   MSComm1.InputMode := comInputModeBinary;//设置接收数据模式为二进制形式   MSComm1.InputLen := 1;//设置Input 一次从接收缓冲读取字节数为1   MSComm1.SThreshold := 1;//设置Output 一次从发送缓冲读取字节数为1   MSComm1.InBufferCount := 0;//清除接收缓冲区   MSComm1.OutBufferCount := 0;//清除发送缓冲区   MSComm1.RThreshold := 1;//设置接收一个字节产生OnComm事件   MSComm1.PortOpen := true;//打开串口1 /////////////////////////////////////////////////////////////   Buffers := '''';   CheckSum := 0; //发送串口命令   Command := 34;   str := ''$'' + #2 + #$22 + #1;//读MP3总曲目   str := str + Char(GetCheckSum(str));//计算校验和   MSComm1.Output := str;//发送串口命令 end;

//以下是接收事件处理过程,在MCU中相当于串口中断

//注意其中2个语句

//while MSComm1.InBufferCount > 0 do//输入FiFO不为空 //if str = '''' then str := #0; //0字符处理 //例接收的数据为#24#02#00#01#03

//此时InBufferCount=5.若设置Input 一次从接收缓冲读取字节数不限

//即:MSComm1.InputLen := 0;则str := MSComm1.Input;后str好象为#24#02#00#01#03

//但实际为''??''#24#02.总得不到结果,至少0字符后的#01#03无法读出.

//采用MSComm1.InputLen := 1;后,并配合while MSComm1.InBufferCount > 0 do

//当读到0字符时,由于str=''''(空),故访问str[1]将会引发异常的发生而导致程序的终止.

//故用if str = '''' then str := #0; 来向str[1]内认为地填入字符#0且str的长度也为1了.

//故此要点是用if str = '''' then str := #0;语句渡过读0字符的难关~~~

procedure TForm1.MSComm1Comm(Sender: TObject); var   str: string;   i: integer; begin   case MSComm1.CommEvent of     comEvReceive://接收事件处理       begin         while MSComm1.InBufferCount > 0 do//输入FiFO不为空         begin           str := MSComm1.Input;//从FIFO中只取1个字符,因为MSComm1.InputLen := 1           if str = '''' then str := #0; //0字符处理           if (Buffers = '''') and (str = ''$'') then//同步符测试           begin             Buffers := str;//存入同步符''$''             CheckSum := 0;//初始化校验和           end           else if (Buffers <> '''') and (Buffers[1] = ''$'') then begin//必须用同步符起始             Buffers := Buffers + str;//加入数据串             CheckSum := CheckSum xor Byte(str[1]);//求校验和(除同步符''$''外)             if Length(Buffers) = Byte(Buffers[2]) + 3 then//结束符测试             begin               if CheckSum = 0 then//此时校验和必须为0表示校验和正确               begin                 case Command of                   $22: begin//取歌曲总数                         ComboBox1.Items.Clear;                         for i := 1 to Byte(Buffers[4]) do                         begin                           str := ''第'' + inttostr(i) + ''首歌曲'';                           ComboBox1.Items.Add(str);//                         end;                         Command := 0;                       end;                   1: ;                 else ;                 end;               end;               Buffers := '''';//接收完毕清空缓冲区               CheckSum := 0;//初始化校验和             end;           end           else           begin             Buffers := '''';//接收错误清空缓冲区,放弃所有数据             CheckSum := 0;//初始化校验和           end;         end;       end;   end; end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值