CTS某个主机阻塞后重发

CTS到某个主机阻塞之后,出现积压
现象有以下3点:
(1) 前端监控显示
值班人员已经发现有未发送的文件积压了
(2)
/behb/cts/work_cts/dist/process在这个目录发现有文件,说明已经积压了。
(3)这里写图片描述
查看Eimon.log,发现有积压

需要进行重发处理
发现未发数多余未到数,在排除DI问题后,可以判断是积压了。

在/home/cts/Bin目录下有redist进程,执行如下命令,可以优先保障到北京的数据重新发送。
./redist /behb/cts/work_cts/dist/process/20161222/10/babj001

# stty -F /dev/ttyS1 speed 4000000 baud; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 1; -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo;// 状态标志 bool has_valid_data = FALSE; // 是否有合法的历史帧 bool sbusLinked = FALSE; // 是否已建立链路 uint32_t no_data_count = 0; // 无新数据计数器(单位:7ms) const uint32_t MAX_NO_DATA_COUNT = 142; // ≈142 * 7ms = 994ms ≈1s uint8_t last_valid_sbus[25] = {0}; // 存储最后一帧有效数据 printf(“******* SBUS_SEND_thread STARTED **********\n”); gettimeofday(&tLastTime, NULL); while (1) { // === 1. 获取当前时间,计算是否到达 7ms 周期 === gettimeofday(&tCurTime, NULL); timeout = (tCurTime.tv_sec - tLastTime.tv_sec) * 1000 + (tCurTime.tv_usec - tLastTime.tv_usec) / 1000; if (timeout >= 7) { const uint8_t frame_to_send = NULL; // === 2. 检查是否有新数据,并更新 last_valid_sbus === pthread_mutex_lock(&sbubs_mutex); if (sbus_data_ready) { // 有新数据:优先使用 memcpy(last_valid_sbus, S_BUS, sizeof(S_BUS)); has_valid_data = TRUE; no_data_count = 0; // 重置超时计数 if (!sbusLinked) { sbusLinked = TRUE; printf(“SBUS link established.\n”); } frame_to_send = S_BUS; sbus_data_ready = FALSE; } else { // 无新数据:尝试重发 last frame if (has_valid_data && no_data_count < MAX_NO_DATA_COUNT) { frame_to_send = last_valid_sbus; } // 否则:不发送任何内容 } pthread_mutex_unlock(&sbubs_mutex); // === 3. 执行发送决策(单一出口)=== if (frame_to_send != NULL) { ret = UART_Write(sbus_fd, (const char)frame_to_send, 25); if (ret < 0) { printf(“UART_Write failed!\n”); } else { // struct tm *tm_info; // char time_buffer[26]; // struct timeval tv; // gettimeofday(&tv, NULL); // tm_info = localtime(&tv.tv_sec); // strftime(time_buffer, 26, “%Y-%m-%d %H:%M:%S”, tm_info); // printf(“[%s.%06ld] SBUS send: %s (%d bytes)\n”, // time_buffer, tv.tv_usec, // (frame_to_send == S_BUS) ? “NEW” : “REPEAT”, // ret); } // 成功发送后递增计数(用于控制重发次数) no_data_count++; } else { // === 4. 超时处理 === if (no_data_count == MAX_NO_DATA_COUNT) { struct timeval tv; gettimeofday(&tv, NULL); printf(“[%ld.%06ld] SBUS TIMEOUT: No valid input for 1 second. Stopping output.\n”, tv.tv_sec, tv.tv_usec); sbusLinked = FALSE; has_valid_data = FALSE; } no_data_count++; // 继续递增直到超限 } // === 5. 统一重置定时器 === gettimeofday(&tLastTime, NULL); } else { usleep(1000); } } return NULL;为什么这个挂测20分钟就出现了726ms没有SBUS数据输出,726ms后连续粘包;uart设置 O_NONBLOCK了,加的打印日志最后看到的这个726ms无数据输出时uart_write返回的是25,一直打印正常,而且中途没有726ms没有打印的情况
11-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值