连续调用void send_log(const char *log),如何实现发送不丢失?
时间: 2024-03-23 10:36:36 浏览: 17
为了确保连续发送不会丢失数据,我们需要保证发送的数据都被串口接收方成功接收。一种简单的实现方法是,在发送数据后,通过串口接收方返回一个确认信息,告诉发送方数据已经成功接收。只有收到确认信息后,发送方才会继续发送下一部分数据。
以下是一个简单的示例代码,其中我们假设串口接收方发送了一个回应字符串 "OK" 来表示数据已经成功接收:
```c
#define MAX_BUFFER_SIZE 1024
#define SEND_DELAY_MS 10
void send_log(const char *log) {
int len = strlen(log);
int sent_len = 0;
char buffer[MAX_BUFFER_SIZE];
while (sent_len < len) {
int copy_len = len - sent_len;
if (copy_len > MAX_BUFFER_SIZE - 1) {
copy_len = MAX_BUFFER_SIZE - 1;
}
memcpy(buffer, &log[sent_len], copy_len);
buffer[copy_len] = '\0';
Uprintf(buffer);
// 等待一段时间后再检查是否有回应
delay(SEND_DELAY_MS);
// 检查是否有回应
char response[3];
int response_len = Uart_GetRxBufLen(DTC_UART);
if (response_len >= 2) {
Uart_Read(DTC_UART, response, 2);
response[2] = '\0';
if (strcmp(response, "OK") == 0) {
sent_len += copy_len;
}
}
}
}
```
在这个例子中,我们在发送数据后,等待一段时间后检查串口接收方是否有回应。如果有回应,我们检查回应字符串是否为 "OK",如果是,说明数据已经成功接收,我们就可以继续发送下一部分数据。如果没有回应或者回应字符串不为 "OK",我们会在下一轮循环中重新发送当前部分数据。这样做可以确保数据不会丢失。