前言
最近研究了电子负载仪的远端控制(区别于前面板控制),主要是用于程序控制,避免繁琐复杂的人工控制,举了南京嘉拓和艾维泰科的例子。
有纰漏请指出,转载请说明。
学习交流请发邮件 1280253714@qq.com
南京嘉拓
Microsoft Word - JT611x系勊çflµå (jartul.com)
RS232接口,TX对TX,RX对RX
输入开启或关闭(无回复)
INP 0
49 4E 50 20 30 0A
输入查询
INP?
49 4E 50 3F 0A
回复
30 0D 0A
或
31 0D 0A
返回0/1参数
该函数解析ASCII码数组,并找到
0D 0A
(即回车和换行符)之前的字符。如果该字符是30
(即数字0
的ASCII码),则返回0
;如果是31
(即数字1
的ASCII码),则返回1
;否则返回-1
表示错误。
s8 HexAsciiToFlag(u8 *hex_ascii_codes)
{
if (hex_ascii_codes[1] == 0x0D && hex_ascii_codes[2] == 0x0A) {
// 检查0D 0A前面的字符是否是30或31
if (hex_ascii_codes[0] == '0') {
return 0;
} else if (hex_ascii_codes[0] == '1') {
return 1;
} else {
// 如果不是30或31,返回-1表示错误
return -1;
}
}
// 如果没有找到0D 0A,返回-1表示错误
return -1;
}
读取电压
20 20 31 39 2E 31 39 0D 0A
19.19
读取带电压信息的ASCII并返回浮点电压
在C语言中,要将ASCII码序列转换成浮点数据,可以通过以下步骤实现:
- 将每个ASCII码转换成对应的字符。
- 拼接这些字符形成一个字符串。
- 使用标准库函数
atof()
或sscanf()
将字符串转换成浮点数。
float HexAsciiToFloat(u8 *hex_ascii_codes)
{
float voltage = 0;
// 将十六进制ASCII码转换成字符,并构建字符串(不包括回车和换行符)
char voltage_str[11] = 0; // +1 为了字符串结束符 '\0'
int i, j = 0;
u8 len = 0;
for (i = 0; i < 10; ++i) {
if (hex_ascii_codes[i] != 0x0D && hex_ascii_codes[i] != 0x0A) {
voltage_str[j++] = (char)hex_ascii_codes[i];
}
}
voltage_str[j] = '\0'; // 添加字符串结束符
// 去除字符串前后的空格
while (voltage_str[0] == ' ') {
memmove(voltage_str, voltage_str + 1, strlen(voltage_str));
}
len = strlen(voltage_str);
while (len > 0 && voltage_str[len - 1] == ' ') {
voltage_str[len - 1] = '\0';
len--;
}
// 使用atof函数将字符串转换为浮点数
voltage = atof(voltage_str);
return voltage;
}
艾维泰科
TTL接口,RX对TX,TX对RX
IV8700系列直流电子负载说明书-东莞市艾维泰科仪器仪表有限公司 (ivytech.top)
控制命令举例
01 10 0A 01 00 02 04 3f 99 99 99 3A C2 设置电流1.2
01 03 0B 00 00 02 C6 2F 获取当前电压
01 05 05 00 FF 00 8c f6 远端控制,禁止前面板控制
01 05 05 00 00 00 cd 06 允许前面板控制
MODBUS-CRC16
#include <stdio.h>
#include <stdint.h>
void CalculateCRC(uint8_t *pByte, int nNumberOfBytes, uint16_t *pCheckSum) {
int nBit;
*pCheckSum = 0xFFFF; // 初始化CRC为0xFFFF
for (int nByte = 0; nByte < nNumberOfBytes; nByte++) {
*pCheckSum ^= pByte[nByte]; // 与当前字节异或
for (nBit = 0; nBit < 8; nBit++) {
if ((*pCheckSum & 0x0001) == 1) { // 检查最低位
*pCheckSum = (*pCheckSum >> 1) ^ 0xA001; // 右移一位并与0xA001异或
} else {
*pCheckSum >>= 1; // 右移一位
}
}
}
}
int main() {
uint8_t data[] = {0x01, 0x03, 0x0B, 0x00, 0x00, 0x02};
uint16_t checksum;
int length = sizeof(data);
CalculateCRC(data, length, &checksum);
printf("CRC-16: %04X\n", checksum); // 输出CRC校验码,格式化为4位十六进制数
return 0;
}