嗨,我正在研究通过串行总线控制电梯的嵌入式系统。每次我发送一条消息(数据包包含地址,数据长度,数据,crc)我都需要等待电梯响应,它由确认包表示。
每次我从电梯收到数据包时都会设置 ACK。接收消息是通过中断完成的。ACK 数据包看起来像:
0xA0,0x00,0x00,0x00,0x00
当它到来时,我将 ACK 设置为true
这是我的发送功能:
bool TransferService::send(char recAddr,char dataLength, char *data){
pc.putc(startByte);
pc.putc(recAddr);
pc.putc(controllerAddress);
pc.putc(dataLength);
for (int i = 0; i < dataLength; i++) {
pc.putc(data[i]);
}
pc.putc(getCrc(recAddr,controllerAddress,data, dataLength));
_messageReceived = false;
timer.reset();
timer.start();
ACK = false;
do {
if (ACK) {
break;
}
} while(timer.read_ms()<=15);
timer.stop();
if (!ACK) {
send(recAddr,dataLength,data);
}
}
这只是尝试,它不起作用。
bool TransferService::send(char recAddr,char dataLength, char *data){
PT_BEGIN();
timer.reset();
timer.start();
do {
pc.putc(startByte);
pc.putc(recAddr);
pc.putc(controllerAddress);
pc.putc(dataLength);
for (int i = 0; i < dataLength; i++) {
pc.putc(data[i]);
}
pc.putc(getCrc(recAddr,controllerAddress,data, dataLength));
_messageReceived = false;
PT_WAIT_UNTIL(!timer.read_ms() <=10 || ACK);
} while(timer.read_ms() <=10);
PT_END();
}
我的问题是如何使用 protothreads 使第一个函数正常工作。