摸鱼聊天、答疑解惑首选之地 --- 车载网络哪些事儿
你是否还在为VT板卡系统昂贵而发愁?是否为MCU log没办法而烦恼?当前车载网络协议测试这块,vector可以说是一家独大,因此各种骚操作一年比一年多,然而对于我们测试工程师来说,我们只想最快、最准确的完成测试,但是VT板卡的价格让大部分公司望而却步。但是对于测试网络唤醒、CAN总线短路等,我们又必须使用CANoe的高精度测试,这也形成了一个矛盾体;那该如何解决呢?继电器是个好东西,时延和准确度都是1ms左右,完全能够满足我们的测试需求,因此我们可以通过控制继电器来实现控制硬线唤醒或者其他硬线的操作,在保证测试结果的情况下做个折中的替代。
另外一方面,在测试过程中,测试工程最烦恼的一件事就是没有MCU log,我们没办法分析,你去复现一下 ,把MCU log抓取一下吧;如果是必现问题还好,但是如果是低概率问题,那无论是谁我想都是痛苦面具了,这不仅浪费我们的时间,实际情况是还不一定有很好的工作产出,那我们该如何去做呢?是的,我们可以直接通过自动化抓取MCU log,这样在每次测试完成,就可以同时抓取MCU log,减少我们的无意义工作量了,因此通过串口抓取log非常有必要了。 那RS232有非常有必要提上日程了,今天我们就来介绍下RS232相关函数。
RS232Open
功能:打开一个串口端口
说明:串行端口在当前执行CAPL代码的节点上可用,同一个端口可以由多个节点使用,如果端口已打开,其他程序将无法再访问串行端口。
port:串口端口号,取值范围1 - 255
返回值:
0:系统上不存在具有给定编号的串行端口或者另一个程序正在占用该串口端口号
1:打开成功
代码示例
if ( 1==RS232Open(1) )
{
write("open serial port 1 success");
TestStepPass("Check","open serial port 1 success");
}
else
{
write("open serial port 1 fail");
TestStepFail("Check","open serial port 1 fail");
}
RS232Close
功能:关闭一个已打开串口
说明:所有节点的串行端口都将关闭。同一个端口可以由多个节点关闭(或重复关闭);关闭后,其他程序可以使用串行端口。关闭串行端口后,端口的配置将丢失。下次打开端口时,将使用系统默认值进行配置。
总结起来就是一旦关闭port串口,CAPL与该串口断开连接,无法被使用;且配置全部恢复为默认配置,再次打开如果有特殊配置需要重新进行配置。
port:串口端口号,取值范围1 - 255
返回值:
0:系统上不存在具有给定编号的串行端口
1:打开成功
代码示例
if ( 1==RS232Close(1) )
{
write("Close serial port 1 success");
TestStepPass("Check","Close serial port 1 success");
}
else
{
write("Close serial port 1 fail");
TestStepFail("Close","open serial port 1 fail");
}
RS232Configure
功能:配置串口参数
说明:
如果是不使用该函数则使用默认配置
默认配置信息:默认波特率 9600,8个数据位,1个停止位,无奇偶校验。
port:串口端口号,取值范围1 - 255
baudrate:用于接收和传输的波特率,通常使用9600。一般根据设备支持的波特率进行设置。通常,115200是允许的最大值。
numberOfDataBits:传输帧内的数据位数;最多使用8,默认一般也是使用8。只有介于5和8之间的值是可能的。串行端口不支持所有值,也不支持与其他帧参数的所有组合。
numberOfStopBits:一种设置传输帧内停止比特数的值。
1 |
使用1个停止位 |
2 |
使用2个停止位 |
parity:标识要使用的奇偶校验模式的值
0 |
未使用奇偶校验,即帧不包含奇偶校验位 |
1 |
奇数奇偶校验 |
2 |
偶数奇偶校验 |
enableParityCheck:指示是启用还是禁用奇偶校验。如果参数奇偶校验设置为0(未使用奇偶校验),则忽略此参数。
0:奇偶校验已禁用
!=0 (≠0):奇偶校验已启用
返回值:
0:如果端口不存在或者端口未打开,则返回0
1:配置成功
代码示例
if (0!=RS232Configure(1,9600,8,1,0))
{
write("configuration serial port 1 success");
TestStepPass("Check","configuration serial port 1 success");
}
else
{
write("configuration serial port 1 fail");
TestStepFail("configuration","open serial port 1 fail");
}
RS232Send
功能:在串行端口上发送数据块。
说明:向串行端口发送一个字节块,该操作开始发送块,回调处理程序RS232OnSend将通知节点完成。
要了解操作后期发生的错误,请使用RS232OnError;出现错误时,不会自动重试。
port:串口端口号,取值范围1 - 255
buffer:将发送其数字的字节数组。
number:要发送的字节数。
返回值:
0:系统上不存在具有给定编号的串行端口;
端口尚未打开;
之前不久使用了另一个非阻塞发送操作;
前一个发送操作可能尚未完成,从而导致错误;
1:成功发送了串口数据。
代码示例
char text[20] = “Hello World !”;
byte buffer[20];
int i;
int length;
length=strlen(text)+1;
//初始化发送buffer
for (i=0;i<length;i++) buffer[i]=text[i];
if (1==RS232Send(1,buffer,length) )
{
write("serial port 1 send data success");
TestStepPass("Check","serial port 1 send data success");
}
else
{
write("serial port 1 send data fail");
TestStepFail("serial port 1 send data fail");
}
RS232Receive
功能:设置串行端口的接收器缓冲区。
说明:如果接收到任何数据,则回调处理程序RS232OnReceive将通知节点。
如果将给出另一个接收操作,则结果缓冲区将更改为上次接收操作给出的缓冲区。
要了解操作后期发生的错误,请使用RS232OnError。接收的重试将持续启动,但如果再次发生错误,将不会通知您。
port:串口端口号,取值范围1 - 255
buffer:接收串口数据的数组。
number:可接受的最大字节数。
返回值:
0:系统上不存在具有给定编号的串行端口;
端口尚未打开;
之前不久使用了另一个非阻塞发送操作;
前一个发送操作可能尚未完成,从而导致错误;
1:成功接收到了串口数据
代码示例
byte mybuffer[20];
int mysize=20;
if ( 1==RS232Receive(1,mybuffer,mysize) )
write(“It works with port 1.”);
if(1 == RS232Receive(F_PowerPort,receivebyte,30))
{
testWaitForTimeout(150);
Byte2Str(gReceiverBuffer,receivebuf,30);
ReSleCur = (atodbl(receivebuf))*500;
if(gReceiverBuffer[0] == 0x22&&
gReceiverBuffer[1] == 0x01&&
gReceiverBuffer[2] == 0x11)
{
testWaitForTimeout(888);ReSleCur = 255;
return ReSleCur;
}
else
{
if((ReSleCur < @NM_test::Sleep_Current)&&(ReSleCur>=0))
{
testWaitForTimeout(3000);
testStepPass("Check","DUT enter sleep success,current: %fmA",ReSleCur);
}
}
}
RS232OnSend
功能:在RS232Send发出的请求完成后,将调用处理程序。
说明:
用于完成对串行端口的发送操作的回调处理程序。
将仅在发出发送操作的节点上调用。
只有在成功时才会调用处理程序
port:串口端口号,取值范围1 - 255
buffer:将发送其数字的字节数组。
number:要发送的字节数。
返回值:
0:如果不使用发送操作,则会发生错误
1:发送成功
代码示例
char text[20] = “Hello World !”;
byte block[20];
int i;
int length;
length=strlen(text)+1;
for (i=0;i<length;i++) block[i]=text[i];
if ( 0!=RS232Send(1,block,length) )
write(“Written block of bytes to port 1.”);
// 在发出发送请求的节点
RS232OnSend(dword port, byte buffer[], dword number)
{
// send completed now, it may time to issue the next send
// buffer==block, number==length
}
RS232OnReceive
功能:如果在端口接收到数据,将定期调用处理程序,从调用RS232Receive开始。
说明:
用于在串行端口接收数据的回调处理程序。
将仅在为给定端口发出RS232Receive操作的节点上调用,只有在成功时才会调用处理程序
缓冲区可能比数字大得多。对于非常慢的连接,可能会调用几个字节的处理程序。至少给出了一个字节。可以在多个节点监听同一个端口,将使用相同的数据调用所有节点。
port:串口端口号,取值范围1 - 255
buffer:接收串口数据的数组。
number:可接受的最大字节数。
返回值:
0:如果没有启动接收操作,则会发生错误
1:接收成功
代码示例
// at sender node
char text[20] = “Hello World !”;
byte block[20];
int i;
int length;
length=strlen(text)+1;
for (i=0;i<length;i++) block[i]=text[i];
if ( 0!=RS232Send(1,block,length) )
write(“Written block of bytes to port 1.”);
byte mybuffer[100];
int mysize = 100;
RS232Receive(2,mybuffer,mysize);
...
// 在发出接收请求的节点
RS232OnReceive(dword port, byte buffer[], dword number)
{
// port==2 here
// buffer==mybuffer, number<=mysize
// buffer contains some parts of block
}
RS232OnError
功能:如果发生错误,将调用处理程序。
说明:
用于在串行端口接收错误的回调处理程序。
将仅在发出发送/接收操作的节点处调用。
对于重复错误(稳定错误条件),只返回第一个错误。这种情况可能发生在接收错误的情况下,即在两个连接端的配置不匹配的情况下。
在配置不匹配的情况下,错误可能不会同时发生,例如,一个端口9600/8/1/无奇偶校验,另一端115200/8/1/没有奇偶校验的配置可能看起来有效(尽管接收到垃圾)。
port:串口端口号,取值范围1 - 255
errorFlags:位被设置为标记条件。
Bit |
Error |
0 |
发送操作失败。 |
1 |
接收操作失败。 |
2 |
帧错误,可能由奇偶校验失配或任何其他帧失配(例如停止位的数量)引起。 |
3 |
帧奇偶校验错误,是由奇偶校验不匹配引起的。 |
4 |
缓冲区溢出,如果发送方的驱动程序发送速度不够快,如果是接收方在太短的时间内获得了太多数据,或者其他任何情况,都没有指定。 |
5 |
接收器缓冲区溢出。 |
6 |
中断状态,另一端请求暂停。 |
7 |
超时,可能是由于错误设置的超时时间太短造成的。请参阅RS232SetHandshake以设置超时。 |
代码示例
RS232OnError(dword port, dword errorFlags)
{
if ( errorFlags & 1 )
writeLineEx(0,3,“send failed”);
if ( errorFlags & 2 )
writeLineEx(0,3,“receive failed”);
}
串口处理函数用的好能够在工作中帮助我们解决很多不必要的麻烦和问题,大家可以深度研究,我们一起交流!!!