/*
*/
/ 用 于 接 收 消 息 的 信 号 量 /
static struct rt_semaphore rx_sem;
static rt_device_t serial2;
static rt_device_t serial1;
/ 接 收 数 据 回 调 函 数 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/* 串 口 接 收 到 数 据 后 产 生 中 断, 调 用 此 回 调 函 数, 然 后 发 送 接 收 信 号 量 */
rt_sem_release(&rx_sem);
return RT_EOK;
}
static void serial_thread_entry(void *parameter)
{
char ch;
while (1)
{
/* 从 串 口 读 取 一 个 字 节 的 数 据, 没 有 读 取 到 则 等 待 接 收 信 号 量 */
while (rt_device_read(serial2, -1, &ch, 1) != 1)
{
/* 阻 塞 等 待 接 收 信 号 量, 等 到 信 号 量 后 再 次 读 取 数 据 */
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
/* 读 取 到 的 数 据 通 过 串 口 错 位 输 出 */
ch = ch;
rt_device_write(serial2, -1, &ch, 1);
printf("%c",ch);
}
}
static int uart_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
char uart2_name[RT_NAME_MAX];
char uart1_name[RT_NAME_MAX];
char str[] = "hello RT-Thread!\r\n";
if (argc == 2)
{
rt_strncpy(uart2_name, argv[1], RT_NAME_MAX);
rt_strncpy(uart1_name, argv[1], RT_NAME_MAX);
}
else
{
rt_strncpy(uart2_name, HUARTNAME2, RT_NAME_MAX);
rt_strncpy(uart1_name, HUARTNAME1, RT_NAME_MAX);
}
/* 查 找 系 统 中 的 串 口 设 备 */
serial2 = rt_device_find(uart2_name);
serial1 = rt_device_find(uart1_name);
if (!serial2)
{
rt_kprintf("find %s failed!\n", uart2_name);
return RT_ERROR;
}
if (!serial1)
{
rt_kprintf("find %s failed!\n", uart1_name);
return RT_ERROR;
}
/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);
/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);
/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));
/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
/* 创 建 成 功 则 启 动 线 程 */
if (thread != RT_NULL)
{
rt_thread_startup(thread);
}
else
{
ret = RT_ERROR;
}
return ret;
}
/ 导 出 到 msh 命 令 列 表 中 /
MSH_CMD_EXPORT(uart_sample, uart device sample);
int main(int argc,char *argv[]){
uart_sample(argc, argv);
return RT_EOK;
}
肯定收不到啦 ( ̄_, ̄ )
首先,你是在 main 函数调用 uart_sample 直接给串口发送数据的。
int main(int argc,char *argv[])
{
uart_sample(argc, argv);
return RT_EOK;
}
然后 uart_sample 函数里要初始化串口,又要发送数据。
/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);
/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);
/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));
/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
问题就在这里呀!你都还没设置好 uart 回调函数,就 open 。。。还没启动串口数据接收线程,就 write 。。。 怎么可能收到数据啊!
所以,解决办法很简单啦,就是调一下顺序呗!
/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);
/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
/* 创 建 成 功 则 启 动 线 程 */
if (thread != RT_NULL)
{
rt_thread_startup(thread);
}
else
{
ret = RT_ERROR;
}
/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);
/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));
另外,你打开两个串口是为了测试是吧?像楼上说的,先确认好串口是不是 uart2,然后改改代码再测试一下吧!应该是可以的!
PS. 建议把串口初始化和 write 操作分开来。
<( ̄︶ ̄)>