| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include "uart.h"
- #include <string.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <stdint.h>
- #include <stdbool.h>
- #include <unistd.h>
- #include <signal.h>
- volatile bool app_exit = false;
- char write_buffer[256];
- void sigint_handler(int signal)
- {
- switch(signal)
- {
- case SIGINT:
- printf("Catch signal CTRL + C\n");
- app_exit = true;
- break;
- default:
- break;
- }
- }
- void pthread_cleanup_handler(void* arg)
- {
- printf("exit uart recv thread. %s\n", (char*)arg);
- }
- void* uart_recv(void* arg)
- {
- if(!arg)
- return NULL;
- uart_handle_st* handle = (uart_handle_st*)arg;
- char buffer[1024];
- char temp[1024];
- int read_size;
- int recv_size = 0;
- int i;
- bool equal = true;
- // 设置线程取消属性:允许取消,延迟取消
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
- pthread_cleanup_push(pthread_cleanup_handler, "uart recv");
- while(!app_exit)
- {
- read_size = uart_read(handle, temp, sizeof(temp)); // 底层的 read 函数本身就是取消点
- // printf("uart recv data size: %d\n", read_size);
- memcpy(buffer + recv_size, temp, read_size);
- recv_size += read_size;
- if(read_size > 0)
- {
- for(i = 0; i < read_size; i++)
- {
- printf("0x%02x %03d", (uint8_t)temp[i], (uint8_t)temp[i]);
- }
- printf("\n");
- }
- if(recv_size == sizeof(write_buffer))
- {
- recv_size = 0;
- for(i = 0; i < sizeof(write_buffer); i++)
- {
- if(buffer[i] != write_buffer[i])
- {
- equal = false;
- break;
- }
- }
- if(equal)
- printf("uart writed and received are equal\n");
- else
- printf("uart writed and received are not equal\n");
- equal = true;
-
- }
- // pthread_testcancel(); // 手动插入取消点
- }
- pthread_cleanup_pop(1);
- pthread_exit(NULL);
- return NULL;
- }
- int main(int argc, char* argv[])
- {
- signal(SIGINT, sigint_handler);
- uart_handle_st uart;
- memset(&uart, 0, sizeof(uart));
- uart_handle_set_device(&uart, "/dev/ttyUSB0");
- uart_handle_set_baudrate(&uart, 115200);
- uart_handle_set_databits(&uart, 8);
- uart_handle_set_stopbits(&uart, 1);
- uart_handle_set_parity(&uart, PARITY_NONE);
- uart_handle_set_flow_control(&uart, FLOW_CONTROL_NONE);
- uart_handle_set_block(&uart, 1);
- pthread_t uart_recv_thread;
- if(uart_handle_open(&uart) < 0)
- {
- printf("Failed to open UART\n");
- return -1;
- }
- pthread_create(&uart_recv_thread, NULL, uart_recv, &uart);
- // pthread_detach(uart_recv_thread);
- int write_size;
- for(int i = 0; i < sizeof(write_buffer); i++)
- {
- write_buffer[i] = i;
- }
- uint8_t data = 0;
- while(!app_exit)
- {
- write_size = uart_write(&uart, &data, 1);
- // printf("uart write data size: %d\n", write_size);
- data++;
- sleep(1);
- }
- printf("exit uart send\n");
- pthread_cancel(uart_recv_thread);
- pthread_join(uart_recv_thread, NULL);
- uart_handle_close(&uart);
- return 0;
- }
|