串口控制可编程电源
当接受到这个项目时,对于我这个初学者来说,我们首先需要明白控制电源需要哪些东西,首先需要一个可编程的电源,其次需要知道这个电源的通信协议,然后就是如果想用串口助手进行控制电源,就需要一个串口助手程序,我这里就是通过串口助手进行对电源的开关、电压、电流进行控制的。
用串口调试助手,首先我们打开软件要对里面的参数要有所了解。就比如波特率是对传输速度和传输量的一个衡量。通过查阅资料我了解到,一般来说,波特率高肯定快,可是有时候有些无法避免的干扰,可能造成某个频段通讯错码率很高,反而用较低的波特率可以实现较稳定的通讯。所以说可以先用高波特率使用,如果通讯时常出错,再考虑降低波特率。一般用调到9600比较合适。
另一个方面就是,在对通信协议的理解上,遇到的一些困难,首先对数据通信的格式这个通过阅读就能理解每一位的含义,理解后我们就能够用想要设定的值进行写数据格式。这里遇到的最大困难就是CRC码的理解,如何通过前面的已知数据计算出CRC码?
在解决这个问题是,首先得明白是CRC码,计算方法在通信协议中已经给出,下来就是计算了。对任意数据的求解,肯定不能每次都用手来计算,我算过一次步骤很多,很容易出错。同时在计算中我觉得应该要注意下面两个问题。
1.要明白使用通信的CRC采用的算法模式,我通过查询,得知常用的有CRC-(4、5、6、7、8),CRC-16,CRC-32每种模式的多项式公式也不同。在通信协议中可知道是16位的CRC码,所以采用的是CRC-16/MODBUS算法,多项式码为A001。
2.要注意最后算出的CRC码要进行高低位的交换,最后才得到CRC校验码。最后最大的问题就是要通过CRC码的计算步骤编写出程序求解CRC校验码。
下面就是我的调试:
首先就是将电源连接线与电脑连接,并在电脑中找到端口,我找到端口为COM3,用电源自带软件获取电源地址,也可设定修改地址我将其修改为了0。然后打开串口助手打开串口通信,查看是否连接COM3口,设置波特率为9600,下来就是发送框发送。
为了更好说明这是我的一个测试例子,设定电源电压103V,电流0.65A.
首先我们将电压,电流指换算成16进制分别为:0406,028A
通过通信协议规则得到的测试电压数据为:00 10 00 00 00 01 02 04 06,通过编程得到CRC码为29 02测试过程如下图:
通过通信协议规则得到的测试电流数据为:00 10 00 01 00 01 02 02 8A,通过编程得到CRC码为2A D6
将00 10 00 00 00 01 02 04 06 29 02发送即设置电压为103V,并得到反馈码00 10 00 00 00 01 00 18
将00 10 00 01 00 01 02 02 8A 2A D6发送即设置电流0.65A,并得到反馈码00 10 00 10 00 01 51 D8
最终结果图:
电源设定结果:
下面是计算CRC码的C语言代码:
#include <stdio.h>
int main(void)
{
unsigned short tmp = 0xFFFF;
unsigned short ret1 = 0;
unsigned char buff[9] = {0};
int j,a;
printf("请输入数据效验位数:");
scanf("%d",&a);
printf("请输入需要传输的数据:\n");
for(j=0;j<a;j++)
{
scanf("%x",&buff[j]);
}
for(int n = 0; n < a; n++)
{
tmp = buff[n] ^ tmp;
for(int i = 0;i < 8;i++)
{
if(tmp & 0x01)
{
tmp = tmp >> 1;
tmp = tmp ^ 0xA001;
}
else{
tmp = tmp >> 1;
}
}
}
/*CRC校验后的值*/
//printf("%X\n",tmp);
/*将CRC校验的高低位对换位置*/
ret1 = tmp >> 8;
ret1 = ret1 | (tmp << 8);
printf("计算得到的CRC检验码: %X\n",ret1);
return 0;
}
如果有什么问题请大家指出,我也还正在学习之中,大家一起交流!