#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的串口通讯的更多相关文章

  1. C#串口通讯实例

    本文参考<C#网络通信程序设计>(张晓明  编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...

  2. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...

  3. 用SPCOMM 在 Delphi中实现串口通讯 转

      用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...

  4. 西门子plc串口通讯方式

    西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...

  5. 教程-Delphi MSComm 实时串口通讯

    Delphi  MSComm 实时串口通讯 MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便.MSComm的控件属性较多,常用的属性如下:1) ...

  6. 浅析PC机串口通讯流控制

    转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...

  7. STM32F10x 学习笔记6(USART实现串口通讯 2)

    这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...

  8. STM32F10x 学习笔记5(USART实现串口通讯 1)

    STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...

  9. Java利用Rxtx进行串口通讯

    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...

随机推荐

  1. 内存管理 & 内存优化技巧 浅析

    内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...

  2. 如何给grldr.mbr和grldr改名

    grldr修改方法: 比如要把grldr 改成gzldr :1.先把文件名改成gzldr:2.用ultraedit或winhex打开gzldr:3.虽然文本框全都是乱码,别管它,把光标定位在右边文本框 ...

  3. Call an activity method from a fragment

    From fragment to activty: ((YourActivityClassName)getActivity()).yourPublicMethod(); From activity t ...

  4. Git学习 -- 分支管理

    创建新分支,并切换到该分支 git checkout -b dev 这一句相当于以下两句: git branch dev 创建 git checkout dev 切换 查看当前分支 git branc ...

  5. 如何参与Hibernate-ORM项目

    1.注册 hibernate jira账户,hibernate中的issue和bug都会在此论坛发布 注册地址:https://hibernate.onjira.com 2.创建Hibernate-O ...

  6. PAT乙1003

    这次终于觉得智商不够用了,特么的. 总结给你的经验,对于这样字符串的题目,经常会出现一种叫做递归定义的东西. 还有一种叫做,相同的字母表示相同的字符串. 这道题目一共有三个条件. 1. 字符串中必须仅 ...

  7. java工程开发之图形化界面之(第四课)

    本节中,我们将创建一个小应用程序,它使用循环生成其图案.我们将使用if语句和setColor方法.同时我们将介绍drawString方法,并使用它在小应用程序窗口中写出文本. 下面的小应用程序是显示一 ...

  8. C# Excel嵌入到Winform

    本文讲的这个技术是把Excel表格嵌入到自己开发程序的Form窗体中进行操作,给客户一个不用切换窗口的操作界面,似乎更好.这在VC中用OLE技术很容易实现,但是在C#中方法就不一样啦.下面将就此进行阐 ...

  9. h5的瀑布流

    <!doctype html><html><head><meta charset="utf-8"><title>超简易瀑 ...

  10. 使用nodejs的net模块创建TCP服务器

    使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...