搜索
bottom↓
回复: 1

串口似乎只收到了一个字节,信号量要如何用?

[复制链接]

出0入0汤圆

发表于 2011-12-27 14:18:48 | 显示全部楼层 |阅读模式
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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-12-30 21:03:43 | 显示全部楼层
直接看书,太简单。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 05:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表