如何使用spcomm控件读写串口数据 ( 积分: 100 )

  • 主题发起人 主题发起人 zjxno1
  • 开始时间 开始时间
两个事件处理过程就可以了
先是一个按钮事件,就是发送一个读vb2vb3的命令
然后是一个接收事件,根据读到的值计算要写入的值,然后发送写入的数据
从PC机串口来讲就是发送-》接收-》发送

//按钮事件,按下按钮发送读取命令
procedure TForm1.BitBtn1Click(Sender: TObject);
var s:string;
begin
s:=‘给我读vb2vb3’;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
end;

//接收事件,已收到下位机数据帧
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var rxbuf:array of byte;
begin
setlength(rxbuf,bufferlength);
move(buffer^,rxbuf[0],bufferlength); //接收数据装入数组
rxbuf[1]:=1; //新的vb3设置值,rxbuf[0]为vb2的原值
//此处可修改数组生成新的写命令
Comm1.WriteCommData(@rxbuf[0],bufferlength); //发送
END;
 
看了maxim88以前的帖子,发现maxim88对串口通讯果然有一套,呵呵,以后还需多多指教!上面代码应该可以完成楼主的要求了。
 
to maxim88: ReceiveData中的sender参数在这里是指的是哪个对象?
 
这个不用了解得这么清楚吧,我也不知道[:D]
 
spcomm在传输十六进制数时为何对11就接收不了呢
 
maxim88,你好!我有问题请教你,怎么和你联络呢?我的邮箱:pzr@hongen.com.cn
 
串口通讯:有接收事件,可以处理你的问题;
不应你等待再发:);而且接收应为另外的线程;

我都不用SPCOMM,另写多线程通讯单元;
 
大家好象都犯了个错误
在procedure TForm1.Comm1ReceiveData里不应该写什么sleep()
sleep是最简单而且使用的东西,比循环等待要好.
应该要做的事情是把接收到的数据迅速的转移走,然后用其他的程序段进行处理,当然可以是另外一个进程!然后继续等待下一个接收到的数据,一直到程序结束!其实spcomm本身就是一个单独的进程!
程序码我就不写了,看了这些应该可以明白了!注意的是你接受到的数据是否合法,当然这是你自己定义的东西,你自己完全能明白什么合法和不合法!
 
我也赞成不用sleep,可能在sleep的时候,没有处理把数据丢掉了,

读串口大家好像都没有什么问题,我们暂且不表,关键是写,和读写的协调,我的做法是,读入数据后放到一个string里面,然后传给另外一个对象去处理这个string,根据这个string决定是否发送数据和发送什么数据,因为Spcomm本身提供了写数据的方法,所以你在另外那个对象里面调用spcomm的方法发送数据就可以了,我这样做没有什么问题,而且很稳定,不知道说清楚了没有
 
后退
顶部