lPC1788的串口通讯

#ifndef __DEBUGSERIAL_H_

#define __DEBUGSERIAL_H_

#include "sys.h"

#include "stdio.h"

extern u8 serialBuffer[256];

extern u16 serialStatus;

//?

void Debug_Serial_Init(u32 baud);

void Debug_Serial_Send_Byte(u8 dat);

void Debug_Serial_Send_Buffer(u8 length,u8* buffer);

#endif

#include "debugSerial.h"

//加入printf支持

#pragma import(__use_no_semihosting)

struct __FILE

{

int handle;

/* Whatever you require here. If the only file you are using is */

/* standard output using printf() for debugging, no file handling */

/* is required. */

};

FILE __stdout;

_sys_exit(int x)

{

x = x;

}

int fputc(int ch, FILE *f)

{

while(!((LPC_UART0->LSR) & 0x20));      //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空

LPC_UART0->THR = (u8)ch;                    //发送数据

return ch;

}

//定义一个256字节的缓冲区用于存放接收到的串口数据信息

//定义一个16位数据同时保存接收数据长度以及接收数据的状态

u8 serialBuffer[256] = {0};

u16 serialStatus = 0;

//16字节的状态

//低八位为当前存储的有效数据长度

//15位为接收完成等待处理标志

//8位表示当前已经接受到回车符\r

//第9到十四位表示在等待处理期间系统冗余发送的数据量

//用于后期通讯系统的负载自适应

void TransSerialsCommand(u8 res)

{

u8 lostCount;

u8 receiveCount;

//接收数据处理

if(serialStatus & (1<<15))//已经接收完成,这个数据被抛弃

{

lostCount = ((u8)(serialStatus>>9))&0x3f;//漏掉的数据计数

if(lostCount < 0x3f)lostCount++;

serialStatus &= ~(0x3f<<9);

serialStatus |= (lostCount<<9);

}

else//上一个命令没有接收完

{

if(serialStatus & (1<<8))//接收到\r

{

//等待接收\N

if(res == ‘\n‘)

{

//接收完成

serialStatus |= 0x8000;

}

else//不是\n,这一次命令作废

{

serialStatus = 0;

}

}

else//没收到\r

{

if(res == ‘\r‘)

{

serialStatus |= 0x0100;

}

else

{

receiveCount = (u8)(serialStatus&0xff);

if(receiveCount < 255)

{

serialBuffer[receiveCount] = res;

receiveCount++;

serialStatus &= 0xff00;

serialStatus |= receiveCount;

}

else

{

//数据溢出,清空

serialStatus = 0;

}

}

}

}

}

void UART0_IRQHandler(void)

{

u8 status = 0;

u8 res = 0;

//清除串口中断挂起

NVIC_ClearPendingIRQ(GPIO_IRQn);

//清除串口接收中断

if(!(LPC_UART0->IIR & 0x01))//确认有中断发生

{

status = LPC_UART0->IIR & 0x0e;

if(status == 0x04)//确认是RDA中断

{

//读取串口接收值

res = (LPC_UART0->RBR&0xff);

//处理串口接收值

TransSerialsCommand(res);

}

}

}

void Debug_Serial_Init(u32 baud)

{

LPC_SC->PCONP |= (1<<3)|(1<<15);                //打开时钟

//配置io口

LPC_IOCON->P0_2 = 0x00;                         //选择TXD功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P0_2 |= (1<<0)|(2<<3);               //上拉

LPC_IOCON->P0_3 = 0x00;                         //选择RXD功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P0_3 |= (1<<0)|(2<<3);               //上拉

LPC_UART0->LCR = 0x83;                          //设置串口数据格式,8位字符长度,1个停止位,无校验,使能除数访问

LPC_UART0->DLM = ((ApbClock/16)/baud) / 256;    //除数高八位  , 没有小数情况

LPC_UART0->DLL = ((ApbClock/16)/baud) % 256;    //除数第八位

LPC_UART0->LCR = 0x03;                          //禁止访问除数锁存器,锁定波特率

LPC_UART0->FCR  = 0x00;                         //禁止FIFO

LPC_UART0->IER = 0x01;                          //使能接收中断RDA

NVIC_EnableIRQ(UART0_IRQn);                     //打开IRQ中断

}

void Debug_Serial_Send_Byte(u8 dat)

{

//当检测到UARTn THR已空时,THRE就会立即被设置。写UnTHR会清零THRE

//0  -  UnTHR包含有效字符

//1  -  UnTHR为空

while(!((LPC_UART0->LSR) & 0x20));      //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空

LPC_UART0->THR = dat;                   //发送数据

}

void Debug_Serial_Send_Buffer(u8 length,u8* buffer)

{

u8 i = 0;

for(i = 0; i < length; i++)

{

Debug_Serial_Send_Byte(buffer[i]);

}

printf("\r\n");

}

时间: 2024-10-05 23:09:05

lPC1788的串口通讯的相关文章

多机串口通讯

★使用器件 使用了3块80c51的单片机,其中U1为主机控制其他两个从机U2,U3.每个单片机上都有一个数码管用来显示数据.主机上有两个按键KEY_1,KEY_2,分别用来控制不同的从机. ★实现目标 主要实现的目标就是通过写多机通讯来了解他们其中的协议,以及简单协议的写法!本程序主要达到了一下效果,主机可以通过发送命令来控制从机:发送数据给从机.接收从机的数据.然后将从机或者主机显示的数据显示在数码管上. ★协议要求 1.地址:主机的地址设置为0x01,从机1(U3)的地址为0x03,从机2(

Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网上问我一些问题.这里写下这篇文档算是一个阶段性的总结. 假设反响好.兴许将会发上Android Stub与新版Android HAL的学习文档. 因为蓝牙模块是串口通讯机制.使用C语言来訪问,而Android的应用层採用Java.无法直接操作硬件.故使用JNI的技术实现主要功能.Android的JN

pcommlite串口通讯库使用

MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,而MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可以使用一个名为pcommlite的串口通讯库,下载安装之后,解压出来的文件包括 根据编译的平台选择相应的lib文件加入工程,并加入pcomm.h文件 寻找系统串口,sio_open()打开串口 sio_close()关闭串口 BYTE i = 0; CString str; // TODO: 在此添

串口通讯方式1编程

在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机"I get X",串口波特率设为9600bps. #include<reg52.h> #define uchar unsigned char unsigned char flag,a,i; uchar code table[]="I get"; void init() { TMOD=0x20;  //设定T1定时器的工作模式2 TH1=0xfd; //T1定时器装初值 TL1=0xfd

(c#2.0)serialPort串口通讯

原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Configuration; usi

Python 串口通讯

摘要: pyserial module: https://github.com/tbusf/pyserial Python使用pyserial进行串口通信:http://blog.csdn.net/log1100/article/details/54380325 串口通讯的python模块--pySerial :http://blog.csdn.net/dainiao01/article/details/5885122 Parameters for the Serial class ser =

Winform 串口通讯之地磅

继上次的读卡之后,要做一个地磅的读取. 下面是我在读卡Demo上改的读取地磅的. 地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果. 其中遇到了一个小问题,文末有介绍. 本人初学菜鸟,大牛们有意见欢迎评论. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6

串口通讯中垃圾数据的处理

在双机串口通讯中,开关机(串口开闭)期间发送方有时候会发一些无效的垃圾数据,同时因为有的协议解析只有接收到一定数量才能解析.这就会出现一个现象:如果开头的数据是错误的,又没有及时丢弃,后面正确的数据接着位置存储,最终造成解析失败.现象就是有时候数据交互正确,有时候错误(冷启动第一次出现错误的几率较大).所以串口通讯中对垃圾数据的防护及解析的顺序方法就显的很重要. if(USART_GetITStatus(UART4,USART_IT_RXNE))    {        USART_ITConf

HALCON串口通讯程序

串口通讯程序 * Note: This example is meant to demonstrate the use of the serial interface * of HALCON.  On Unix machines, the output and input is from /dev/tty, i.e., the * window from which you have started HDevelop.  On Windows NT machines, * this progra