加入和上层控制器协议解析,可收命令和发送命令返回

This commit is contained in:
pxzleo 2023-04-12 01:02:52 +08:00
parent 818afa73a1
commit b132ed8a57
6 changed files with 227 additions and 84 deletions

6
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"files.associations": {
"cstddef": "cpp",
"algorithm": "cpp"
}
}

View File

@ -13,7 +13,7 @@ platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
monitor_speed = 115200
--upload-port = COM[14]
upload-port = COM[14]
lib_deps =
bogde/HX711@^0.7.5
mathertel/OneButton@^2.0.3

178
src/Serialcommand.cpp Normal file
View File

@ -0,0 +1,178 @@
#include "Serialcommand.h"
#include "Arduino.h"
Serialcommand::Serialcommand()
{
// 连接控制器
Serial2.begin(115200);
// clear serialport
while (Serial2.read() >= 0)
{
}
CmdState = 0;
bufferIndex = 0;
recv_flag = false;
outBuffer[0] = 0xff;
outBuffer[1] = 0xff;
}
Serialcommand::~Serialcommand()
{
}
void Serialcommand::Uart_Command_Rev(void)
{
while (Serial2.available() > 0)
{
ch = Serial2.read();
// printf("rev:%d\n", ch);
switch (CmdState)
{
// 开始标志1
case 0:
{
if (0xFF == ch)
{
CmdState = 1;
// printf("st:%d\n", CmdState);
}
}
break;
// 开始标志2
case 1:
{
if (0xFF == ch)
{
bufferIndex = 0;
CmdState = 2;
// printf("st:%d\n", CmdState);
}
else
CmdState = 0;
}
break;
// 取长度,准备收数据
case 2:
{
datalen = ch;
// printf("datalen:%d\n", datalen);
if (datalen <= inbuffersize)
{
CmdState = 3;
bufferIndex = 0;
inBuffer[bufferIndex] = ch;
// printf("buf:%d:%d\n", bufferIndex, inBuffer[bufferIndex]);
}
else // 超长
{
CmdState = 0;
}
}
break;
// 收数据直到结束
case 3:
{
// printf("st3:%d:%d\n", bufferIndex, datalen);
if (bufferIndex <= datalen)
{
bufferIndex++;
inBuffer[bufferIndex] = ch;
// printf("buf:%d:%d\n", bufferIndex, inBuffer[bufferIndex]);
if (bufferIndex == datalen) // 收完了
{
CmdState = 0;
recv_flag = true;
bufferIndex = 0;
return; // 不收数据了,先出去解析
}
}
}
break;
}
}
}
uint8_t Serialcommand::getsum(const uint8_t *buffer, size_t size)
{
uint16_t usum = 0;
uint8_t chksum = 0;
for (uint8_t i = 0; i < size; i++)
{
usum += buffer[i];
}
chksum = (uint8_t)usum & 0xff; // 取低8位
return chksum;
}
bool Serialcommand::checksum()
{
uint8_t bufsum = inBuffer[datalen]; // 校验和
uint8_t chksum = getsum(inBuffer, datalen - 1); // 不算sum字节
if (chksum != bufsum)
{
printf("sum fault :data_sum:0x%02X,add_sum:0x%02X\n", bufsum, chksum);
}
return bufsum == chksum;
}
void Serialcommand::sendcmdret(uint8_t cmdret)
{
// 长度
outBuffer[2] = 0x02;
// 标识命令返回
outBuffer[3] = 0x01;
// 返回数据
outBuffer[4] = cmdret;
outBuffer[5] = getsum(outBuffer + 2, 3);
Serial2.write(outBuffer, 6);
}
void Serialcommand::getcommand()
{
Uart_Command_Rev();
// 收到有效数据
if (recv_flag)
{
// printf("rev end len:%d\n", datalen);
recv_flag = false;
// 处理数据
if (checksum())
{
uint8_t commandid = inBuffer[1];
printf("rev ok cid:0x%02X\n", commandid);
switch (commandid)
{
// 放钩
case 0x01:
{
sendcmdret(0); // 成功
}
break;
// 收钩
case 0x02:
{
sendcmdret(0); // 成功
}
break;
// 停止
case 0x03:
{
sendcmdret(0); // 成功
}
break;
// 查询当前状态
case 0x04:
{
sendcmdret(0); // 发送状态
}
break;
// 设置速度
case 0x05:
{
sendcmdret(0); // 成功
}
break;
default:
sendcmdret(100); // 失败,未知命令
}
}
memset(inBuffer, 0x00, sizeof(inBuffer));
}
}

24
src/Serialcommand.h Normal file
View File

@ -0,0 +1,24 @@
#include "Arduino.h"
class Serialcommand
{
private:
static const int inbuffersize = 20;
int CmdState; // 指令接收状态
uint8_t ch; // 临时单个字符存储
int datalen;
bool recv_flag; // 指令接收成功标志
uint8_t inBuffer[inbuffersize]; // 接收指令缓冲区
uint8_t bufferIndex;
static const int outbuffersize = 20;
uint8_t outBuffer[outbuffersize];
void Uart_Command_Rev(void);
uint8_t getsum(const uint8_t *buffer, size_t size);
bool checksum();
void sendcmdret(uint8_t cmdret);
public:
Serialcommand(); // 构造函数
~Serialcommand(); // 析构函数
void getcommand();
};

11
src/config.h Normal file
View File

@ -0,0 +1,11 @@
//硬件接口定义文件
// 按钮
#define BTN_UP 23 // 收线开关 接线BTN_UP---GND
#define BTN_DOWN 22 // 放线开关
#define BTN_CT 21 // 到顶检测开关
// LED
#define LED_TIP 19 // 指示灯 接线LED_TIP---3.3V
// 称重传感器- HX711
#define LOADCELL_DOUT_PIN 2
#define LOADCELL_SCK_PIN 4

View File

@ -1,16 +1,9 @@
#include "HX711.h"
#include "OneButton.h"
#include "Serialcommand.h"
#include "config.h"
// 硬件引脚定义--------------------------
// 按钮
#define BTN_UP 23 // 收线开关 接线BTN_UP---GND
#define BTN_DOWN 22 // 放线开关
#define BTN_CT 21 // 到顶检测开关
// LED
#define LED_TIP 19 // 指示灯 接线LED_TIP---3.3V
// 称重传感器- HX711
#define LOADCELL_DOUT_PIN 2
#define LOADCELL_SCK_PIN 4
// 角度传感器
// 收放线电机控制
@ -21,6 +14,7 @@ OneButton button_up(BTN_UP, true);
OneButton button_down(BTN_DOWN, true);
OneButton button_checktop(BTN_CT, true);
HX711 scale;
Serialcommand sercomm;
void upbtn_click();
void downbtn_click();
@ -33,12 +27,7 @@ void setup()
// 调试串口
Serial.begin(115200);
Serial.println("Starting PullupDevice...");
// 连接控制器
Serial2.begin(115200);
// clear serialport
while (Serial2.read() >= 0)
{
}
// 初始化按钮
button_up.attachClick(upbtn_click);
@ -85,6 +74,8 @@ void loop()
button_checktop.tick();
button_down.tick();
button_up.tick();
sercomm.getcommand();
delay(10);
// Serial.print("PullUnits:\t");
@ -109,70 +100,3 @@ void upbtn_click()
{
Serial.println("upbtn_click");
}
const int bufnum = 20;
char buffer[bufnum];
const int sendbufnum = 5;
char sendbuffer[sendbufnum] = {(char)0xFF, (char)0xFF, (char)0x00, (char)0x00, (char)0x00};
int datareadpos = 0; // 数据读取位置
void getcommand()
{
datareadpos = 0;
int headpos = 0;
// 是否有数据有就读bufnum个
//数据头2个字节FF FF
while (Serial2.available() > 0)
{
buffer[datareadpos] = Serial2.read();
if ((datareadpos > 1) && (buffer[datareadpos] == 0xFF) && (buffer[datareadpos - 1] == 0xFF))
headpos = datareadpos - 1;
datareadpos++;
delay(20);
// 读超过buff长度退出
if (datareadpos >= bufnum)
break;
}
if (datareadpos > 0)
{
printf("rev[%d]:", datareadpos);
for (int i = 0; i < datareadpos; i++)
{
printf("0x%02X,", (byte)buffer[i]);
}
}
// 是否读了bufnum个数据
if (((byte)buffer[headpos] == 0xFF) && ((byte)buffer[headpos + 1] == 0xFF))
{
byte sumbyte = (byte)(buffer[headpos + 2] + buffer[headpos + 3] + buffer[headpos + 4]) & 0xFF;
if ((byte)buffer[headpos + 5] == sumbyte)
{
int cmd_type = buffer[headpos + 2];
switch (cmd_type)
{
case 0x01: // 收线
/* code */
break;
case 0x02: // 放线
/* code */
break;
default:
break;
}
}
}
// clear serial buffer
while (Serial2.available() > 0)
{
Serial2.read();
delay(5);
}
for (int i = 0; i < bufnum; i++)
{
buffer[i] = '\0';
}
}