linux 串口回环测试,esp32运行的第一个程序(串口回环测试)

1、串口回环测试(电脑串口发送数据,原数据返回)

代码如下

/*串口初始化

* */

void Uart0_Init()

{

/* Configure parameters of an UART driver,

* communication pins and install the driver */

uart_config_t uart_config = {

.baud_rate = 115200,

.data_bits = UART_DATA_8_BITS,

.parity  = UART_PARITY_DISABLE,

.stop_bits = UART_STOP_BITS_1,

.flow_ctrl = UART_HW_FLOWCTRL_DISABLE

};

uart_param_config(UART_NUM_0, &uart_config);

uart_set_pin(UART_NUM_0, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);

uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);

}

static void echo_task()

{

uint8_t *data = (uint8_t *) malloc(BUF_SIZE);

while (1) {

// Read data from the UART

int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);

// Write data back to the UART

uart_write_bytes(UART_NUM_0, (const char *) data, len);

}

}

例程2解析:串口事件处理

1、初始化串口

void Uart0even_Init()

{

uart_config_t uart_config = {

.baud_rate = 115200,

.data_bits = UART_DATA_8_BITS,

.parity = UART_PARITY_DISABLE,

.stop_bits = UART_STOP_BITS_1,

.flow_ctrl = UART_HW_FLOWCTRL_DISABLE

}; 初始化串口参数配置

uart_param_config(UART_NUM_0, &uart_config);

uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);设置串口的发送接受引脚,本例程采用默认配置。

uart_driver_install(UART_NUM_0, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);

安装串口驱动,设置发送接受缓冲区大小,

//Set uart pattern detect function.

uart_enable_pattern_det_intr(UART_NUM_0, '+', PATTERN_CHR_NUM, 10000, 10, 10);

设置串口特殊字符串作为事件处理功能

uart_pattern_queue_reset(UART_NUM_0, 20);

分配给定长度的队列内存来保存设置模式的接受到的数据

}

static void echo_task(void *pvParameters)

{

uart_event_t event; 定义串口事件

size_t buffered_size;

uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE); 开辟接受数据内存

esp_log_level_set(TAG, ESP_LOG_INFO);

设置输出日志等级

Uart0even_Init();

while (1) {

判断串口接受信息队列是否有数据,并保存到事件结构体

if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) {

bzero(dtmp, RD_BUF_SIZE); 数据缓冲区置0

ESP_LOGI(TAG, "uart[%d] event:", UART_NUM_0);

switch(event.type) { 判断串口事件

case UART_DATA: 串口数据事件

ESP_LOGI(TAG, "[UART DATA]: %d", event.size);

uart_read_bytes(UART_NUM_0, dtmp, event.size, portMAX_DELAY);

ESP_LOGI(TAG, "[DATA EVT]:");

uart_write_bytes(UART_NUM_0, (const char*) dtmp, event.size);

break;

//Event of HW FIFO overflow detected

case UART_FIFO_OVF:

ESP_LOGI(TAG, "hw fifo overflow");

// If fifo overflow happened, you should consider adding flow control for your application.

// The ISR has already reset the rx FIFO,

// As an example, we directly flush the rx buffer here in order to read more data.

uart_flush_input(UART_NUM_0);

xQueueReset(uart0_queue);

break;

//Event of UART ring buffer full

case UART_BUFFER_FULL:

ESP_LOGI(TAG, "ring buffer full");

// If buffer full happened, you should consider encreasing your buffer size

// As an example, we directly flush the rx buffer here in order to read more data.

uart_flush_input(UART_NUM_0);

xQueueReset(uart0_queue);

break;

//Event of UART RX break detected

case UART_BREAK:

ESP_LOGI(TAG, "uart rx break");

break;

//Event of UART parity check error

case UART_PARITY_ERR:

ESP_LOGI(TAG, "uart parity error");

break;

//Event of UART frame error

case UART_FRAME_ERR:

ESP_LOGI(TAG, "uart frame error");

break;

//UART_PATTERN_DET

case UART_PATTERN_DET: 串口设置模式事件

uart_get_buffered_data_len(UART_NUM_0, &buffered_size);获取数据缓冲区数据长度

int pos = uart_pattern_pop_pos(UART_NUM_0); 设置模式位置

ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", pos, buffered_size);

if (pos == -1) {

// There used to be a UART_PATTERN_DET event, but the pattern position queue is full so that it can not

// record the position. We should set a larger queue size.

// As an example, we directly flush the rx buffer here.

uart_flush_input(UART_NUM_0);

} else {

uart_read_bytes(UART_NUM_0, dtmp, pos, 100 / portTICK_PERIOD_MS);

uint8_t pat[PATTERN_CHR_NUM + 1];

memset(pat, 0, sizeof(pat));

uart_read_bytes(UART_NUM_0, pat, PATTERN_CHR_NUM, 100 / portTICK_PERIOD_MS);

ESP_LOGI(TAG, "read data: %s", dtmp);

ESP_LOGI(TAG, "read pat : %s", pat);

}

break;

//Others

default:

ESP_LOGI(TAG, "uart event type: %d", event.type);

break;

}

}

}

free(dtmp);

dtmp = NULL;

vTaskDelete(NULL);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: linux串口回环测试程序是一种测试串口通信功能的程序,通过将发送的数据回传给接收端进行验证,以确定串口是否正常工作。 要实现该测试程序,首先需要打开串口设备文件。在Linux中,串口设备文件通常位于/dev目录下,如/dev/ttyS0代表第一个串口设备。可以使用open()函数来打开串口设备文件,例如open("/dev/ttyS0", O_RDWR)。 接下来,需要设置串口的参数,包括波特率、数据位、停止位等。可以使用termios结构体和tcsetattr函数来设置串口参数,例如: struct termios oldTio, newTio; tcgetattr(fd, &oldTio); newTio = oldTio; cfsetispeed(&newTio, B9600); // 设置波特率为9600 cfsetospeed(&newTio, B9600); newTio.c_cflag &= ~PARENB; // 不启用奇偶校验 newTio.c_cflag &= ~CSTOPB; // 停止位为1 newTio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 关闭标准模式和回显 tcsetattr(fd, TCSANOW, &newTio); 然后,可以使用read()函数从串口读取接收到的数据,并使用write()函数将该数据发送回串口。可以使用一个循环来实现不断进行回环测试,例如: while (1) { char buffer[256]; int bytesRead = read(fd, buffer, sizeof(buffer)); write(fd, buffer, bytesRead); } 最后,需要关闭串口设备文件,可以使用close()函数来关闭已打开的串口设备文件,例如close(fd)。 通过运行回环测试程序,可以验证串口设备是否正常工作,是否能正常发送和接收数据。 ### 回答2: Linux串口回环测试程序是一种用于测试串口通信功能的程序串口是一种用于将数据通过物理电缆传输的通信接口,常用于连接计算机与外部设备。 Linux系统提供了一种简单而有效的方法来测试串口的功能,即通过发送数据并接收相同数据来完成回环测试。以下是一个实现简单串口回环测试的示例程序: 1. 首先,打开终端并进入Linux系统。 2. 使用命令行工具编写一个C语言程序,实现串口回环测试。 ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main() { int serial_port; char data[10] = "Hello!"; // 打开串口设备文件 serial_port = open("/dev/ttyS0", O_RDWR); if (serial_port < 0) { printf("无法打开串口设备文件。\n"); return -1; } // 配置串口 struct termios tty; tcgetattr(serial_port, &tty); cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag &= ~PARENB; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; tty.c_cflag &= ~CRTSCTS; tty.c_cflag |= CREAD | CLOCAL; tty.c_iflag &= ~(IXON | IXOFF | IXANY); tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); tty.c_oflag &= ~OPOST; tcsetattr(serial_port, TCSANOW, &tty); // 发送数据 write(serial_port, &data, sizeof(data)); // 接收数据 char receivedData[10]; read(serial_port, &receivedData, sizeof(receivedData)); // 检查数据 if (strcmp(data, receivedData) == 0) { printf("串口回环测试成功!\n"); } else { printf("串口回环测试失败。\n"); } // 关闭串口 close(serial_port); return 0; } ``` 3. 保存程序并编译为可执行文件,例如命名为"serial_test"。 4. 运行程序,它将打开串口设备文件,并将数据发送到串口。然后,它将等待接收到来自串口的相同数据,并将其与发送的数据进行比较。如果两者相同,则表示串口回环测试成功,否则表示失败。 需要注意的是,在代码中使用的串口设备文件"/dev/ttyS0"是一个示例,实际使用时应根据不同的系统和串口配置来修改。 串口回环测试程序对于验证串口通信的可靠性和正确性非常有用。 ### 回答3: Linux串口回环测试程序可以通过打开两个串口设备,一个作为发送端口,一个作为接收端口,实现数据的发送和接收。具体步骤如下: 1. 首先,在终端中输入以下命令,加载UART设备驱动: ``` sudo modprobe serial ``` 2. 使用`ls /dev/tty*`命令查看系统中的串口设备,记下发送端口和接收端口的设备名称,例如`/dev/ttyUSB0`和`/dev/ttyUSB1`。 3. 创建一个C语言源文件,例如`serial_test.c`,编写串口回环测试程序的代码。 4. 在代码中,首先使用`open()`函数打开发送端口和接收端口的设备文件,成功打开后会返回一个文件描述符。 5. 接下来,使用`ioctl()`函数设置串口的通信参数,例如波特率、数据位、停止位和奇偶校验位等。这里可以使用`struct termios`结构体来设置通信参数。 6. 然后,利用`tcflush()`函数刷新发送端口和接收端口的输入输出缓冲区。 7. 接下来,进入一个循环,从发送端口读取数据,并将读取到的数据写入接收端口。可以使用`read()`函数和`write()`函数分别进行读取和写入操作。 8. 最后,使用`close()`函数关闭发送端口和接收端口的设备文件,释放资源。 9. 编译并运行程序,可以使用以下命令进行编译和执行: ``` gcc -o serial_test serial_test.c ./serial_test ``` 通过以上步骤,就可以实现Linux串口回环测试程序,用于测试串口的通信功能是否正常。在测试时,可以通过发送一些数据,并检查接收端是否能够正确接收到相同的数据,以验证串口回环功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值