|
lpc2378串口发送收到的数据,线程代码是参考的网络转串口项目里的代码,用到了信号量,现在只能发送收到的第一个字符,要怎么改啊?
#include <rtthread.h>
#include "lpc23xx.h"
struct rt_semaphore rx_sem;
rt_device_t dev_uart1;
unsigned int usart_bytes_sent = 0;
unsigned int usart_bytes_recv = 0;
rt_err_t usart_rx_indicate(rt_device_t dev, rt_size_t size)
{
while(size--)
{
rt_sem_release(&rx_sem);
}
return RT_EOK;
}
#define RX_BUF_SIZE 1024
static char rx_buf[RX_BUF_SIZE];
static short rx_buf_offset = 0;
void usart_rx_thread_entry(void *p)
{
while( rt_sem_take(&rx_sem,RT_WAITING_FOREVER) == RT_EOK )
{
register rt_base_t temp;
// if rj45 not connected, we should route data between 232 and 485.
// we split rx_buf to 2 parts in order to save space.
int len1;
// Clear the semaphore.
temp = rt_hw_interrupt_disable();
rx_sem.value = 0;
rt_hw_interrupt_enable(temp);
// recv usart1
//rt_sem_take(&tx1_sem,RT_WAITING_FOREVER);
len1 = rt_device_read(dev_uart1,0,rx_buf,RX_BUF_SIZE/2);
if( len1 )
dev_uart1->write(dev_uart1, 0, rx_buf, len1);
else
rt_sem_release(&tx1_sem);
// rt_sem_release(&tx1_sem);
rt_sem_release(&rx_sem);
}
rt_kprintf("Error taking semaphore, usart rx exit!\n");
}
void rt_init_thread_entry(void *parameter)
{
rt_thread_t usart_rx_thread;
rt_sem_init(&rx_sem,"semrx",0,RT_IPC_FLAG_FIFO);
rt_sem_init(&tx1_sem,"semtx0",1,RT_IPC_FLAG_FIFO);
dev_uart1 = rt_device_find("uart1");
if( dev_uart1 == RT_NULL )
{
rt_kprintf("uart1 not found!!\n");
return;
}
rt_device_set_rx_indicate(dev_uart1,usart_rx_indicate);
usart_rx_thread = rt_thread_create("urx",usart_rx_thread_entry, RT_NULL,1024, 3, 5);
rt_thread_startup(usart_rx_thread);
}
/* 用户应用程序入口点 */
int rt_application_init()
{
rt_thread_t init_thread;
init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 8, 5);
rt_thread_startup(init_thread);
return 0;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|