为了方便测试自制电调的性能,本人设计了用于测试电调的MFC程序。该程序能够实时接收和显示电调的状态,当电调采用串口控制时,该软件可以实时控制电调。程序的界面如下图所示: (1)通信协议和报文 本软件通过串口与电调进行通信,波特率默认为38400,数据位为8位,停止位为1,无奇偶校验位,电调发送之上位机报文速率为100ms一帧,上位机发送至电调的报文速率也为100ms一帧。 每帧报文包含30个字节,每个字节对应的内容如下: 首字节为标示符‘#’; 次字节为电调地址0、1、2.。。。; 下一字节为cmd;(当需要重启电调时,该指令为‘R’) 中间为数据区(进行了编码处理,内容将下文) 末字节为结束符‘\r’; 数据区之所以进行编码是由于为了能够识别出报文起始和结束符,在报文的中间必须不能够出现与之相同的字符。以下列出使用到的几个关键ASCII码 # — 35 0x23 \r — 13 0x0D 从上述的ASCII码值,要是的数据区的每个字节值必须>35或者<13但是>电调地址再或者<35但大于>13,很明显大于35的数据范围比较广,所以将数据编码到大于35的ASCII码的值比较方便。MK电调采用此种方法,将原来的数据由三个字节扩充为四个字节,并将各个字节加上‘=’(0x3D),从而使得扩充后的字节均大于大于‘#’。编码后的数据区数据将全部大于’#’、‘\r’,从而从接收得到的报文中可以检测出报文头和尾。 编码主要程序如下: SendeBuffer[pt++] = '#'; // Startzeichen SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) SendeBuffer[pt++] = cmd; // Commando
while(len) { if(len) { a = snd[ptr++]; len--;} else a =0; if(len) { b = snd[ptr++]; len--;} else b =0; if(len) { c = snd[ptr++]; len--;} else c =0; SendeBuffer[pt++] = '=' + (a >> 2); SendeBuffer[pt++] = '=' + (((a & 0x03)<< 4) | ((b & 0xf0) >> 4)); SendeBuffer[pt++] = '=' + (((b & 0x0f)<< 2) | ((c & 0xc0) >> 6)); SendeBuffer[pt++] = '=' + ( c & 0x3f); } AddCRC(pt); } 对应的解码程序如下: while(len) { a = RxdBuffer[ptrIn++] - '='; b =RxdBuffer[ptrIn++] - '='; c = RxdBuffer[ptrIn++] - '='; d = RxdBuffer[ptrIn++] - '='; if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, alsempfangen wurden
x = (a << 2) | (b >> 4); y = ((b & 0x0f) << 4) | (c>> 2); z = ((c & 0x03) << 6) | d;
if(len--) ptrOut[ptr++] = x; else break; if(len--) ptrOut[ptr++] = y; else break; if(len--) ptrOut[ptr++] = z; else break; } 上述报文数据区的内容为以下结构体: struct str_Debug { unsigned char Digital[2]; // 8位 unsigned short int Analog[8]; // 16位 }; 电调至上位机: Digital[0] —————— 自检结果, 0-正常 非0-故障代码 Digital[1] —————— 命令来源与电调状态 [1:0] – 00 串口 –01 I2C -- 10 PPM [2] 0-停止 1-运行 Analog[0]—— 电流 Analog[1]—— 电压 Analog[2]—— 占空比 Analog[3]—— 速度 上位机至电调(仅当控制指令来自串口时可以使用): Digital[0] —————— 急停 Digital[1] ——————占空比 Analog 保留 注:此处与MK电调有所区别,在MK电调中定义如下变量 unsigned charMotorTest[4] = {0,0,0,0}; MotorTest每个字节分别对应0、1、2、3地址电调的占空比。 上位机发送的数据仅为每个电调地址对应的占空比而已,上位机至电调数据量较小,减小中的发生率,有利于换相,在后期的电调制作中,将对此予以优化。 (2)报文接收与发送 电调报文接收主要采用中断完成,每接收到一个字节即产生一个中断,这样很容易识别开始和结束的标示字节,完成一帧完整报文的接收。 相对于电调来说上位机软件采用MFC编制,采用专用的串口控件MSComm。MFC程序根据串口接收事件进入接收子程序,但是接收得到的内容不再只是一个字节还可能是多个字节,为此将接收到的报文存于recvbuffer[100]中,该缓存器能够循环存储。然后检测刚接收到的报文中是否含有结束符,若有再将报文摘出存储于recvdata[30],对recvdata[30]中数据进行解码,从而得到电调发送的数据。 电调发送报文比较简单,将需发送字节放入发送寄存器,不停检测发送完成标志,当发送结束,再将下个字节放入发送寄存器。 上位机发送功能比较简单,直接将要发送的数据,定时存入发送缓存器中即可。
以上介绍本人编制的MFC电调程序,如需进一步了解这个程序,还需要对源程序进行分析。
|