/usr/bin/sn.core.elf getstat 该指令打印的是Status:WR mode : WRC_SLAVE_WR0 wr0 -> lnk:1 rx:3009 tx:15889 lock:1 syncs:wr0 sv:1 ss:'TRACK_PHASE' aux:0 sec:6328 nsec:312981472 mu:867139 dms:418560 dtxm:138191 drxm:294473 dtxs:46407 drxs:172643 asym:30019 crtt:215425 cko:-9 setp:8781 hd:56899 md:31800 ad:65000 ucnt:737 wr1 -> lnk:0 rx:18853 tx:7362 lock:1 temp: 39.562 C Time: Thu, Jan 1, 1970, 01:45:28 +991471232 nanoseconds. 用c调用该指令 并将temp mu dms crtt的值保存到一个文本中 且保证文本掉电不丢失数据 其中mu dms crtt的值需要判断 当wr0->lnk:为1 则将获取到的mu dms crtt的值存到WR1这一行 当wr1->lnk:为1 则将获取到的mu dms crtt的值村到WR0这一行 并且该文本每行获取到的这些数据最多有50个 当第51个值存入时 将第一个值舍弃 以此类推
时间: 2024-02-06 12:02:46 浏览: 135
这个问题需要结合系统底层调用和文件操作进行解答。下面是一个示例代码,可以实现该功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#define BUF_SIZE 1024 // 读取文件的缓冲区大小
#define MAX_VALUES 50 // 每行最多存储的数据个数
int main()
{
const char* cmd = "/usr/bin/sn.core.elf getstat"; // 待执行的指令
const char* filename = "data.txt"; // 保存结果的文件名
char buf[BUF_SIZE]; // 读取文件的缓冲区
int fd; // 文件描述符
int link0 = 0, link1 = 0; // link 状态
int values[MAX_VALUES] = {0}; // 存储获取到的数据
int count = 0; // 当前存储的数据个数
int wr0_values[MAX_VALUES] = {0}; // 存储 link0 对应的数据
int wr1_values[MAX_VALUES] = {0}; // 存储 link1 对应的数据
int i;
while (1) {
FILE* fp = popen(cmd, "r"); // 执行指令并打开管道
if (fp == NULL) {
perror("popen failed");
exit(1);
}
// 读取管道中的输出内容
while (fgets(buf, BUF_SIZE, fp) != NULL) {
// 解析输出的内容
if (strstr(buf, "wr0 -> lnk:1")) {
link0 = 1;
link1 = 0;
} else if (strstr(buf, "wr1 -> lnk:1")) {
link0 = 0;
link1 = 1;
} else if (strstr(buf, "temp:")) {
float temp;
sscanf(buf, " temp: %f C", &temp);
values[count++] = (int) (temp * 1000);
} else if (strstr(buf, "mu:")) {
int mu, dms, crtt;
sscanf(buf, " mu:%d dms:%d crtt:%d", &mu, &dms, &crtt);
values[count++] = mu;
values[count++] = dms;
values[count++] = crtt;
}
}
pclose(fp); // 关闭管道
// 将获取到的数据存入文件中
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd == -1) {
perror("open failed");
exit(1);
}
// 获取当前时间
time_t now = time(NULL);
struct tm* tm_info = localtime(&now);
char time_str[50];
strftime(time_str, sizeof(time_str), "%a, %d %b %Y %H:%M:%S %z", tm_info);
// 写入数据
if (link0) {
write(fd, "WR0: ", 5);
for (i = 0; i < count && i < MAX_VALUES; i++) {
wr0_values[i] = values[i];
char str[20];
sprintf(str, "%d ", wr0_values[i]);
write(fd, str, strlen(str));
}
write(fd, time_str, strlen(time_str));
write(fd, "\n", 1);
if (count > MAX_VALUES) {
memcpy(wr0_values, wr0_values + count - MAX_VALUES, MAX_VALUES * sizeof(int));
count = MAX_VALUES;
}
} else if (link1) {
write(fd, "WR1: ", 5);
for (i = 0; i < count && i < MAX_VALUES; i++) {
wr1_values[i] = values[i];
char str[20];
sprintf(str, "%d ", wr1_values[i]);
write(fd, str, strlen(str));
}
write(fd, time_str, strlen(time_str));
write(fd, "\n", 1);
if (count > MAX_VALUES) {
memcpy(wr1_values, wr1_values + count - MAX_VALUES, MAX_VALUES * sizeof(int));
count = MAX_VALUES;
}
}
close(fd); // 关闭文件
// 清空缓冲区和计数器
memset(buf, 0, BUF_SIZE);
memset(values, 0, MAX_VALUES * sizeof(int));
count = 0;
// 等待 1 秒后再次执行
sleep(1);
}
return 0;
}
```
在上面的代码中,首先定义了待执行的指令和保存结果的文件名,然后定义了一些变量来存储获取到的数据和 link 状态。在主循环中,首先执行指令并读取管道中的输出内容,然后解析输出的内容,将获取到的数据存储到相应的变量中。接下来,将获取到的数据存储到文件中,如果存储的数据量超过了最大值,则舍弃最早的数据。最后,清空缓冲区和计数器,等待 1 秒后再次执行。
需要注意的是,该程序需要以 root 身份运行才能执行 `/usr/bin/sn.core.elf` 指令,而且需要在编译时链接 libm 库,即使用 `gcc -o program program.c -lm` 命令进行编译。
阅读全文