power_app.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/select.h>
  7. #include <errno.h>
  8. #define DEVICE_PATH "/dev/power"
  9. #define BUFFER_SIZE 256
  10. int main() {
  11. int fd;
  12. fd_set read_fds;
  13. struct timeval timeout;
  14. char buffer[BUFFER_SIZE];
  15. int ret;
  16. // 1. 以非阻塞方式打开设备节点(也可以阻塞,但select会管理)
  17. fd = open(DEVICE_PATH, O_RDONLY | O_NONBLOCK);
  18. if (fd < 0) {
  19. perror("open device failed");
  20. return EXIT_FAILURE;
  21. }
  22. printf("Waiting for data from %s (select mode)...\n", DEVICE_PATH);
  23. while (1) {
  24. // 2. 清空文件描述符集,并加入我们的fd
  25. FD_ZERO(&read_fds);
  26. FD_SET(fd, &read_fds);
  27. // 3. 设置超时时间(例如5秒)
  28. timeout.tv_sec = 5;
  29. timeout.tv_usec = 0;
  30. // 4. 等待fd可读
  31. ret = select(fd + 1, &read_fds, NULL, NULL, &timeout);
  32. if (ret < 0) {
  33. perror("select error");
  34. close(fd);
  35. return EXIT_FAILURE;
  36. } else if (ret == 0) {
  37. printf("select timeout after 5 seconds, continue waiting...\n");
  38. continue;
  39. }
  40. // 5. 检查是否是我们的fd可读
  41. if (FD_ISSET(fd, &read_fds)) {
  42. memset(buffer, 0, BUFFER_SIZE);
  43. ret = read(fd, buffer, BUFFER_SIZE - 1);
  44. if (ret < 0) {
  45. if (errno != EAGAIN) {
  46. perror("read error");
  47. }
  48. continue;
  49. } else if (ret == 0) {
  50. printf("device closed? ret=0\n");
  51. break;
  52. } else {
  53. printf("Received %d bytes: %s\n", ret, buffer);
  54. // 根据实际数据格式处理
  55. // 例如解析电池电量等信息
  56. if (strstr(buffer, "battery") != NULL) {
  57. printf(" -> Battery related data\n");
  58. }
  59. }
  60. }
  61. }
  62. close(fd);
  63. return EXIT_SUCCESS;
  64. }