串口配置
- RS232Open
- RS232Configure
- RS232Send
- RS232Receive
- RS232Close
- RS232SetHandshake
CAPL串口的API就如下图那么多,下面分别介绍API怎么用。
RS232Open
- dword RS232Open( dword port )
打开串口,当串口不存在或者被其它的应用占用,返回值为0,打开成功,则返回为1.
我这里没有RS232的硬件,就用虚拟串口虚拟了两个串口 COM5和COM6,
虚拟串口我是通过翻墙下载的,绿色无广告,也没有捆绑乱七八糟软件。
虚拟串口下载
上面串口创建成功后,在设备管理器里面看以看得到。
下面我们通过CAPL代码演示下:
1 2 3 4 5 6 7 8 9 | on key 'g' { long res; byte Port_Num = 6 ; res = RS232Open(Port_Num) ; if(res==1) { write("opened port sucess"); } |
输出:
opened port sucess //打开串口6成功
RS232Configure
- dword RS232Configure( dword port, dword baudrate, dword numberOfDataBits, dword numberOfStopBits, dword parity ); // form 1
配置串口的波特率,数据比特的长度,和校验位等 ,默认配置是(9600,8,1,0)。
RS232Send
- dword RS232Send( dword port, byte buffer[], dword number )
发送一串byte类型数据。如果发送成功返回值为1,失败返回值为0;而且这个API有两个回调函数,当发送成功的时候会调用 RS232OnSend(),发送失败的话,会调用 RS232OnError()
- RS232OnSend( dword port, byte buffer[], dword number )
- RS232OnError( dword port, dword errorFlags )
下面通过CAPL演示 发送 “hello world !”字符串到COM6:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /*@!Encoding:ASCII*/ on key 'g' { long res; char text[20] = "Hello World !"; byte buffer[20]; int i; int length; byte Port_Num = 6 ; res = RS232Open(Port_Num) ;//打开串口 if(res==1) write("opened port success."); res=RS232Configure(Port_Num,9600,8,1,0);//配置串口 if(res==1) write("Configure Port6 Success."); length=strlen(text)+1; for (i=0;i<length;i++) buffer[i]=text[i]; res = RS232Send(Port_Num,buffer,length); //发送数据。 if ( res==1) write("send successs."); } RS232OnSend(dword port, byte buffer[], dword number) { //发送函数成功的回调函数 char timeStamp[30]; char text[20]; int i; getLocalTimeString(timeStamp); snprintf(text,elCount(text),""); for(i=0;i<number;i++) { snprintf(text,elCount(text),"%s%c",text,buffer[i]); } write("%s : >>>>%s",timeStamp,text); } RS232OnError(dword port, dword errorFlags) { //发送函数失败的回调函数 if ( errorFlags & 1 ) writeLineEx(0,3,"send failed"); if ( errorFlags & 2 ) writeLineEx(0,3,"receive failed"); } |
输出结果如下:
另一方面我们也通过串口工具监控下,我们是否真的发送成功了。
下面的串口公爵也是我是通过翻墙下载的,绿色无广告,也没有捆绑乱七八糟软件。
串口工具下载
RS232Receive
- RS232Receive( dword port, byte buffer[], dword size )
用法同RS232send,如果接收成功返回值为1,失败返回值为0;而且这个API有两个回调函数,当发送成功的时候会调用 RS232OnReceive(),发送失败的话,会调用 RS232OnError()
调用过RS232send()就可以直接调用RS232Receive()
下面通过CAPL演示 发送 “hello COM5!”字符串到COM6 ;然后我们通过COM5发送“hello COM6!”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /*@!Encoding:ASCII*/ on key 'g' { long res; char text[20] = “hello COM5!” byte buffer[20]; int i; int length; byte Port_Num = 6 ; res = RS232Open(Port_Num) ;//打开串口 if(res==1) write("opened port success."); res=RS232Configure(Port_Num,9600,8,1,0);//配置串口 if(res==1) write("Configure Port6 Success."); length=strlen(text)+1; for (i=0;i<length;i++) buffer[i]=text[i]; res = RS232Send(Port_Num,buffer,length); //发送数据。 if ( res==1) write("send successs."); res = RS232Receive(Port_Num,buffer,length); //注册接收事件 if ( res==1) write("Receive successs."); } RS232OnSend(dword port, byte buffer[], dword number) { //发送函数成功的回调函数 char timeStamp[30]; char text[20]; int i; getLocalTimeString(timeStamp); snprintf(text,elCount(text),""); for(i=0;i<number;i++) { snprintf(text,elCount(text),"%s%c",text,buffer[i]); } write("%s : >>>>%s",timeStamp,text); } RS232OnError(dword port, dword errorFlags) { //发送函数失败的回调函数 if ( errorFlags & 1 ) writeLineEx(0,3,"send failed"); if ( errorFlags & 2 ) writeLineEx(0,3,"receive failed"); } |
RS232Close
- dword RS232Close( dword port )
良好的编程习惯要有始有终
在脚本中添加下列代码,当工程停止的时候,程序自动回收当前串口的。
1 2 3 4 | on preStop { RS232Close(portNum); } |
RS232SetHandshake
- dword RS232SetHandshake( dword port, dword handshake, dword XonLimit,
dword XoffLimit, dword XonChar, dword XoffChar )
设置通信握手方式,一般情况无需设置。
一