实验室正在研究基于AT91SAM7se512芯片的无人机系统和基于SImulink的无人机飞行仿真平台,主控制芯片与外围传感器的通讯和主控芯片与PC机的通讯是本项目最基本的部分,下面将此段时间对串口通信的认识记录下来,由于本人知识水平的有限,欢迎各位读者积极指正,我将不胜感激。

(一)、硬件部分.

在AT91SAM7se512的串口通信过程中,我使用的是usb转串口线,单一的232串口还是不能和主控芯片连接的,因为二者的电平不一样,232的电平为:高电平=-(3~15)V,低电平=+(3~15)V,而主控芯片的电平为TTL电平,高电平=3V,低电平=0V。所以在串口通信中,必须使用一块232电平转TTL电平的芯片,这里采用的是ADM3202,ADM3202是四通道的TTL转RS232电平的芯片。

由于AT91SAM7se512的两个串口在系统中已经使用,这里选择DBGU口的串口功能做的实验。

(二)、软件的实现

因为在串口发送和接收过程中,中断方式有利于提高cpu的利用率,所以在此选择中断方式。

2.1 初始化

在串口的初始化程序中,需要对串口的IO引脚分配、电源管理、串口配置、AIC中断配置和使能、PDC的设置和DBGU中断的使能进行设置。初始化程序如下所示:

void AT91F_DBGU_Simulink_Init(void)
{AT91F_DBGU_CfgPIO();AT91F_DBGU_CfgPMC();AT91F_US_Configure ((AT91PS_USART)AT91C_BASE_DBGU, AT91B_MCK,AT91C_US_ASYNC_MODE,115200, 0); AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_SYS, DBGU_USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Debug_Simulink_irq_handler);AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);// Set the PDCAT91F_PDC_Open (AT91C_BASE_PDC_DBGU);//* address to the next bloc to be receivedAT91C_BASE_DBGU->DBGU_RPR = (unsigned int) simulink_queue;AT91C_BASE_DBGU->DBGU_RCR = SIMULINK_NUM;//* 137个字符//*  and AT91C_US_ENDRXAT91F_DBGU_InterruptEnable(AT91C_BASE_DBGU,AT91C_US_RXBUFF  );//* RX Buffer Full Interrupt Enable// 字符串形式
}

以上各个函数和参数在lib_AT91SAM7se512.h、 T91SAM7se512.h中定义的,Debug_Simulink_irq_handle为中断服务程序,simulink_queue和SIMULINK_NUM为接收缓冲区及其大小,在此使用的中断触发为RXBUFF(接收缓冲区满)和TXBUFE(发送缓冲区空),RXBUFF中断在初始化中使能,而TXBUFF中断在主函数中使能,稍后会有讲解。

2.2中断服务程序
中断服务程序Debug_Simulink_irq_handle如下:

void Debug_Simulink_irq_handler(void)
{AT91PS_DBGU USART_pt = AT91C_BASE_DBGU;unsigned int status;//* get Usart status register and active interruptstatus = USART_pt->DBGU_CSR ;//获得通道状态status &= USART_pt->DBGU_IMR;//去掉屏蔽的状态if ( status & AT91C_US_RXBUFF)//如果是RXBUFF,则设置DBGU_RPR和DBGU_RCR{AT91C_BASE_DBGU->DBGU_RPR = (unsigned int) simulink_queue;AT91C_BASE_DBGU->DBGU_RCR = SIMULINK_NUM;simulink_flag=1;}if ( status & AT91C_US_TXBUFE)//如果是TXBUFE,则设置DBGU_TPR和DBGU_TCP{ AT91F_DBGU_InterruptDisable(AT91C_BASE_DBGU,AT91C_US_TXBUFE  );to_simulink_transmit_flag=true;AT91C_BASE_DBGU->DBGU_TPR = (unsigned int)NULL;AT91C_BASE_DBGU->DBGU_TCR = 0;}//* Reset the satus bit for errorUSART_pt->DBGU_CR = AT91C_US_RSTSTA;//错误状态位复位
} 

2.3 主函数

void main(void )
{//初始化函数for(; ; )//主循环{//省略若干if (simulink_flag == 1){deal_simulink_data();//处理从PC机发送到控制芯片的数据simulink_flag = 0;}//省略若干output2simulink();//发送数据到PC机}
}

其中deal_simulink_data()函数和output2simulink()函数如下:

void deal_simulink_data(void)
{char save_line[SIMULINK_NUM],*line=NULL;// 不指空 死机?strncpy( save_line, simulink_queue,SIMULINK_NUM );line=save_line;//line指向接收到数据的存储地址//省略若干}
void output2simulink(void)
{int len=3;if(to_simulink_transmit_flag==true){//-------------------control mode------------------------------------  put2simulink[len++]=',';put2simulink[len++]=control_mode+48;//--------------------PWM--------------------------------------------for(int i = 0;i < 4;i ++){put2simulink[len++] = ',';len += sprintf(put2simulink+len,"%4d",sim_servo_widths[i]);}put2simulink[len++]='\r';put2simulink[len++]='\n';to_simulink_transmit_flag=false; AT91C_BASE_DBGU->DBGU_TPR = (unsigned int)put2simulink;AT91C_BASE_DBGU->DBGU_TCR = len;AT91F_DBGU_InterruptEnable(AT91C_BASE_DBGU,AT91C_US_TXBUFE  );//开TXBUFE中断}
}

(三)总结

使用串口调试助手即可以实现PC与ARM板的通信,如果想用其他串口来检测从PC发送到ARM的数据是否正确,检测ARM是否正常接收了由PC发送来的数据,这里有两种方法:

1 、使用IAR中的调试功能,在处理接收数据的地方加一句调试语句printf("%s",line);在Terminal I/O中可以看到输出的字符串。

2、使用其他串口将PC发送到ARM版的数据在发送到PC端,用串口调试助手既可以看到。

在以上两种方法中,我更加喜欢第二种,因为第一种的printf函数占用的调试时间太长,而第二种可以实际反应出程序运行时间情况。

在检测过程中,有几种情况可能导致数据不正确:

1、PC端与ARM板的波特率没有对应起来,这是最容易发现的,也是最容易解决的,将二者的波特率设为一样即可。

2、程序中各个缓冲区的长度不对,这是比较难找的问题,就是因为这个问题,我花了很长的时间才解决好这个问题,本以为检测用的缓冲区的定义的长度只要足够大即可,其实不然,PC端发送字符串的长度、ARM中接收缓冲区定义的长度,实际使用缓冲区的长度、ARM中另一个串口发送字符串的缓冲区定义的长度、实际使用的长度要一致,这里最容易忽略的地方是两个缓冲区的定义的长度,当定义的长度与实际接收的字符串的长度不同的时候,会出现周期性乱码的现象,具体原因我还不明白,希望各位高手指教。

基于AT91SAM7se512的串口通讯的实现相关推荐

  1. 基于VB的串口通讯及其软件实现

    1 串口通信的通信机理 PC串行通信是指直接对串行端口的UART(PC机的通用异步收发器,也叫异步通信适配器,是PC机用于异步通信的接口)进行编程实现的通信 一般说来,PC机都有一个或多个串行端口,它 ...

  2. Java串口通讯 基于Java的串口通讯demo

    自认为更好的方法 https://blog.csdn.net/qq_34775102/article/details/107212822 效果图 1.导入RXTXcomm.jar 链接:https:/ ...

  3. 基于java的串口通讯(附带实例+说明文档+测试工具)

    在步入正题前,发个牢骚. 前天总公司的一个技术经理下达一个任务,实现java程序与串口的通信.半天做出来了(见附件),经理看了,在电话里说是直接从网上下载的,颇为不屑. 说实话,当时真TM火大!虽然现 ...

  4. 基于Netty实现串口通讯

    这个其实在官方示例里面有,我在官方示例的基础上改写了一下,当时本来是Java,被转换成Kotlin搞忘改回来了,大家凑合着看,Kotlin也不难理解: object RxtxClient {// 在外 ...

  5. 基于STM32的USART串口通讯程序

    文章目录 一.串口协议和RS-232.485标准,以及RS232.485电平与TTL电平的区别,USB/TTL转232模块的工作原理 1.串口协议 2.RS-232.RS-485标准 3.RS232. ...

  6. 基于STM32F103C8的USART串口通讯程序

    目录 一.串口协议和RS-232.485标准,RS232.485电平.与TTL电平的区别,"USB/TTL转232"模块的工作原理(以CH340芯片模块为例) 一.串口协议 STM ...

  7. 基于STM32安装Stm32CubeMX,配合Keil完成LED流水灯和USART串口通讯程序,及其管脚的时序波形观察

    目录 一.使用HAL库完成LED流水灯 (一).用STM32CUBEMX生成工程文件 (二).用Keil仿真调试并生成hex文件 (三).用STM32串口烧录程序 (四).实物连接 二.使用HAL库完 ...

  8. c语言stm32串口控制单片机,基于STM32F103C8T6单片机电脑串口通讯控灯设计(原理图+程序+论文)...

    题目:基于STM32F103C8T6单片机电脑串口通讯控灯设计 内容要求: 一. 任务 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换.在现代工业控 ...

  9. VC基于MSCOMM控件串口通讯

    在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...

  10. 基于STC98C52RD+的51MCU学习流水账--->串口通讯学习(汇编版)

    开篇语: 1-收集-->整理-->消化-->分享,收集多年,开始迈出分享这步. 2-从点灯-->到数码管-->撸到串口,目前卡在串口.无法实现基本串口通讯. 为了便于后期 ...

最新文章

  1. 新建html带参数,本地html加载时带参数的问题
  2. jmeter对需要登录的接口进行性能测测试
  3. platform设备驱动全透析
  4. linux下GPRS ppp拨号默认路由问题(存在eth0)
  5. Netty常见面试题 与 答案
  6. ethtool查看网卡以及修改网卡配置
  7. 微服务架构实战篇(一):使用start.spring.io 构建SpringBoot2.0项目
  8. 【面试】基于二叉树层次遍历相关问题的求解
  9. Nginx教程(三) Nginx日志管理 (转)
  10. python屏幕录像专家_可以推荐一款电脑录屏软件吗?
  11. MacOS Big Sur 11.5.2 (20G95) OC 0.7.2 / Cl 5138 / PE 三分区原版黑苹果镜像
  12. 联想7x04服务器装系统,联想硬盘保护EDU7X的安装方法.doc
  13. 蓝色对比关系图表合集PPT模板
  14. MPS柔性生产线加工实训系统QY-JDYT34
  15. 技能高考计算机专业考什么,2016年技能高考计算机专业考试总结.pdf
  16. gunicorn简介、架构、安装与配置
  17. 中国剩余定理证明及代码实现
  18. 手机浏览器类型( user agent)判断
  19. DBCS(Double-Byte Character Set, 双位元组字元集)
  20. git clone时需要密码

热门文章

  1. 计算机主机接口有哪些,主机接口有哪些
  2. 网络协议抓包分析(二)抓取聊天信息
  3. 微信公众账号查看历史消息
  4. zz淘宝笑到喷的评价
  5. 表格结构标签 thead tbody
  6. Linux下的磁盘分区简介
  7. 《论文阅读》PSF-LO: Parameterized Semantic Features Based Lidar Odometry
  8. 嵌入式开发培训怎么样,嵌入式开发培训前景如何?
  9. Unity DOTS Burst 运行分析
  10. 美计算机科学学者建议:加强青少年网络安全意识引导