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");
}
lPC1788的串口通讯的更多相关文章
- C#串口通讯实例
本文参考<C#网络通信程序设计>(张晓明 编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...
- delphi之动态库调用和串口通讯
串口通讯: Spcomm 控件属性: CommName :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...
- 用SPCOMM 在 Delphi中实现串口通讯 转
用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...
- 西门子plc串口通讯方式
西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...
- 教程-Delphi MSComm 实时串口通讯
Delphi MSComm 实时串口通讯 MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便.MSComm的控件属性较多,常用的属性如下:1) ...
- 浅析PC机串口通讯流控制
转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...
- STM32F10x 学习笔记6(USART实现串口通讯 2)
这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...
- STM32F10x 学习笔记5(USART实现串口通讯 1)
STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...
- Java利用Rxtx进行串口通讯
最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...
随机推荐
- POJ 2182/暴力/BIT/线段树
POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...
- div.2/Bellovin<最长上升子序列>
题意: 序列arr[i--n];输出以a[i]为结尾的最长上升子序列.1<=n<=100000; 思路: O(n*log(n)),求最长上升子序列. #include<cstdio& ...
- libMobileGestalt与UDID
libMobileGestalt与UDID 没有评论 在iOS中,libMobileGestalt动态库, 用来取得各种系统变量,比如UDID, 磁盘使用量, 设备版本 在iOS7中,对于开发者来说, ...
- UIRoot
scalingStyle: Flexible:固定大小,不管设备屏幕的大小是多少,都以固定的像素显示UI Constrained: 可适应屏幕 如要使640*480像素的背景图适应屏幕,要如下设置 c ...
- JAVA动态代理详解
1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程 ...
- 使用for循环还是foreach循环?
很多时候我们很自然的认为,for循环的时候使用foreach和原来的for循环用下标的方式遍历是相同的. 而且因为foreach循环写法简单,很容易理解,而且少去了很多麻烦的变量,所以估计在学会使用f ...
- Entity Framework 学习初级篇2--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍
本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...
- 浅谈Android五大布局
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- C#入门经典第十章接口的实现
- VS2005混合编译ARM汇编代码-转
原文地址:http://blog.csdn.net/annelcf/article/details/5468093 公司HW team有人希望可以给他们写一个在WinCE上,单独读写DDR的工具,以方 ...