打印

我封装了一个相对好用的串口库(提供源码)

[复制链接]
6318|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
re张风|  楼主 | 2011-6-30 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 re张风 于 2011-7-17 14:38 编辑

我老是讨厌官方的串口库,每次用都得写一大堆代码,所以为了自己使用方便,也就基于我自己的ARM核心板的芯片STM32F103ZCT6,重新封装了一个静态库。如有兴趣,各位可以参考。先说明,是静态库,不是源码。

库下载: HOM3103_USARTV2.rar (16.57 KB)

更新内容:
接收中断管理的BUFF更改为由外部程序提供,这样保证RAM的正确。
函数“OpenUART”进行了修改

头文件说明如下:
#ifndef _hom3103_usart_h
#define _hom3103_usart_h

typedef  unsigned int      UARTHandle;

#define COM1  (0)
#define COM2  (1)
#define COM3  (2)

#define Parity_No     ((unsigned short)0x0000)
#define Parity_Even   ((unsigned short)0x0400)
#define Parity_Odd    ((unsigned short)0x0600)

/*
    功能描述:打开串口
        打开系统中合理存在的串口,如串口已打开,则会再进行一次初始化。

    输入参数:
        UART_PORT: 要打开的串口编号。指定为COM1、COM2、COM3
        BaudRate:要打开串口的通讯波特率,2400-921600
        Databits:数据位长度,8位或9位
        Stopbits:停止位长充,1位或两位
        Parity:  奇偶校验方式,主要有:无校验、奇校验、偶校验三种方式
        RxBuf: 接收数据缓冲区 (V2版新增参数)

    返回值:>0 当串口打开成功,当前值为串口打开的handle值。以后的操作全依靠该值。
            =0 串口打开失败,主要是串口编号不正确
            

*/
UARTHandle OpenUART( unsigned char UART_PORT , int BaudRate, unsigned char Databits, unsigned char Stopbits ,unsigned short Parity , unsigned char *RxBuf );


/*
    功能描述:关闭已打开的串口
        关闭所指定的串口,如该口存在,则执行关闭操作,否则失败


    输入参数:
        hUART:串口的handle值,即打开串口成功后得到的handle值

    返回值: 1 正常关闭指定串口
            0 串口handle参数不正确,操作失败
*/
unsigned char CloseUART( UARTHandle hUART );

/*
    功能描述:读取串口接收到的数据
        库中开了200字节的接收BUFF,调用该函数,可以将BUFF中的数据全部读出来。
        
    输入参数:
        hUART:串口的handle值,即打开串口成功后得到的handle值
        *RxBuf:所读取的数据存放的地址指针。在应用中需定义该指针所指向的BUFF
        
    返回值:所读取的数据长度。如为0,则没有数据被读到。   
*/
unsigned int ReceiveString( UARTHandle hUART , unsigned char *RxBuf);

/*
    功能描述:串口数据发送
        通过指定的串口发送数据

    输入参数:
        hUART:串口的handle值,即打开串口成功后得到的handle值
        *TxBuf:要发送数据的BUFF指针。该BUFF需在应用中定义
        txLen:要发送数据的字节长度
        
    返回值: 1 数据发送正常启动
            0 串口handle参数不正确,操作失败
*/
unsigned char  SendString( UARTHandle hUART , unsigned char *TxBuf , unsigned short txLen );

#endif
沙发
re张风|  楼主 | 2011-6-30 20:10 | 只看该作者
本帖最后由 re张风 于 2011-7-15 14:25 编辑

应用操作的例子:(使用第二版库,需要进行对OPENUART调用时进行修改)
#include "string.h"
#include "hom3103_usart.h"


int main(void)

{

        unsigned short iTmp1;
        UARTHandle   UcHandel;
        unsigned char  UcTXBuf[200],UcRXBuf[200];

        SysInit(); //各位自己去封装系统的初始化
        UcHandel=OpenUART(COM1,115200,8,1,Parity_No,UcRXBuf); //串口初始化

        while(1)
        {
                iTmp1 = ReceiveString( UcHandel, UcTXBuf );//查询串口数据,有的话则iTmp1是大于0的
                if(iTmp1>0)
                {
                        
                             SendString(UcHandel,UcTXBuf,iTmp1);//将接收到的数据又通过本串口发送出去
                }
                ms_Delay(10);

        }

        return 0;
}

使用特权

评论回复
板凳
McuPlayer| | 2011-7-1 10:03 | 只看该作者
自己封的话,尽量消息驱动的,不用老靠while循环来看数据来了没
如果图省事,就用ST自家的

使用特权

评论回复
地板
mohanwei| | 2011-7-1 11:23 | 只看该作者
这种静态库别人敢用才怪……
库不要看起来觉得“眼花缭乱”,厂家已经够仁义了……况且用的时候拷贝个文件还不够省事?出了疑难杂症,源码里下个断点岂不是很爽?
如果你看到编译后的汇编代码,可能更会觉得像天书一样……:lol

使用特权

评论回复
5
heuyck| | 2011-7-1 14:44 | 只看该作者
楼主这个好像带FIFO的吧,不过没源代码是不敢用,万一有点问题要找死人的。

使用特权

评论回复
6
re张风|  楼主 | 2011-7-1 15:40 | 只看该作者
在库内部,肯定用FIFO。否则不安全。

使用特权

评论回复
7
ningzb| | 2011-7-5 14:48 | 只看该作者
楼主精神可嘉,只是没有源码怕敢用的人不多吧!我是会老老实实的用ST的库!

使用特权

评论回复
8
香水城| | 2011-7-5 15:20 | 只看该作者
本帖最后由 香水城 于 2011-7-5 15:21 编辑

发棉裤,鼓励创新!

分享源码就更好了。

使用特权

评论回复
9
re张风|  楼主 | 2011-7-15 14:42 | 只看该作者
本帖最后由 re张风 于 2011-7-15 14:45 编辑

小弟的源码拿来了。各位指教一下子哈
在原来的基础上修改了接收BUFF的方式。
现在由应用程序给定一个BUFF作为接收的BUFF,这们做成库以后,就不会有BUFF在库中存在,应该更合理一点点。
HOM3103_USART_Sor.rar (3.44 KB)

使用特权

评论回复
10
xfcylyf| | 2011-7-15 14:59 | 只看该作者
过几天用一用再说

使用特权

评论回复
11
无冕之王| | 2011-7-15 16:15 | 只看该作者
先收藏了,鼓励创新

使用特权

评论回复
12
wangtezi| | 2011-7-16 14:27 | 只看该作者
好好好,不晓得支不支持多任务发送?
下下来看看先

使用特权

评论回复
13
mohanwei| | 2011-7-16 15:28 | 只看该作者
定义一个串口数量的宏:
#define USART_NUM 3
把“uint32_t USART_ADD[3]={USART1_BASE,USART2_BASE,USART3_BASE };”改成:
uint32_t USART_ADD[USART_NUM]=
{
        USART1_BASE,
        USART2_BASE,
        USART3_BASE
};
其他例如“USART_TAB[3]”依此类推……

有了USART_NUM,所有串口都可以做到一致对待:
void USART1_IRQHandler(void)
{
        USART_IRQHandler(0);
}
void USART2_IRQHandler(void)
{
        USART_IRQHandler(1);
}
void USART3_IRQHandler(void)
{
        USART_IRQHandler(2);
}
void USART_IRQHandler(u32 UartNum)
{
        这里根据USART_ADD[UartNum],USART_TAB[UartNum],USART_PORTn[UartNum],USART_RxBuff[UartNum]……等来操作,不要出现switch-case和具体的寄存器了
}

使用特权

评论回复
14
baidudz| | 2011-7-16 16:26 | 只看该作者
好不好用,需要检验一下,还是欣赏这种创新精神的

使用特权

评论回复
15
yybj| | 2011-7-16 20:46 | 只看该作者
参考一下吧,有源码就更好了

使用特权

评论回复
16
秋天落叶| | 2011-7-17 11:33 | 只看该作者
如果有源码,就更容易用了:lol

使用特权

评论回复
17
McuPlayer| | 2011-7-17 14:28 | 只看该作者
裤子穿的好,鼓励创新

使用特权

评论回复
18
hsbjb| | 2011-7-17 20:18 | 只看该作者
楼主提供源码了,多谢哈

使用特权

评论回复
19
yujie870705| | 2011-7-28 17:59 | 只看该作者
顶,不知道有人试验过没?可不可以用?

使用特权

评论回复
20
yujie870705| | 2011-7-29 11:34 | 只看该作者
看了一遍,要是接收数据溢出会怎么样?求指教!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:走,向前走,再走,继续走! http://www.uectr.com

51

主题

525

帖子

1

粉丝