msp430f149单片机单片机有多少个串口

捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&基于VB6.0 的MSP430 单片机与PC 机串口通信设计
  摘要:串行通信已经成为计算机与其他设备进行数据交换最广泛的通信手段。主要介绍了利用 的串口通信模块和VB6.0 提供的串行通信控件MSComm 实现PC 机与MSP430 单片机的串行通信,并着重阐述了在VB6.0 环境下实现的主要过程。
  1 引言
  随着计算机技术的不断发展,计算机应用在其发展过程中逐步形成两大分支,一是通用计算机,PC 机为代表,着眼于高速数值运算和数据处理,但实时测控能力较弱。二是嵌入式微机,以单片机为代表,着重发展测控技术,但其数值运算和数据处理能力较弱。目前,在工业控制以及数据采集和数据处理的大型系统中,由于PC 机软件资源丰富,人机交互方便等优点。以PC 机作为上位机,以单片机组成的控制单元作为下位机,较好地实现测控及显示,又能较快地实现数据采集和处理。逐渐成为现代工业控制领域的一个优化方案。
  故提出了基于VB6.0 的PC 机与MSP430 单片机串行通信的实现方法。以 接口为基础,以PC 机为上位机,以MSP430 系列单片机为下位机。通过VB6.0 实现了对各个下位机控制参数的实时监控和管理,解决了长期以来单片机与PC机互连中编程难度大,运行效率低的瓶颈。
  2& MSComm 控件与MSP430 单片机
  2.1 MSComm 控件
  计算机编程语言中,Visual Basic 6.0 是Microsoft 公司推出的面向对象的可视化开发编程工具,具有丰富的数据类型和结构化程序结构,开发效率高,界面制作美观方便等优点,且应用日益广泛,故Visual Basic 6.0 语言做到了真正的面向对象编程。其中,MSComm 控件全称为Microsoft CommunicationControl, 是微软公司提供的ActiveX 控件, 目的是为了简化Windows 下串行通信编程。通过对此控件的属性和事件进行编程, 从而实现数据的发送和接收。
  MSComm 控件通过串行端口传输和接收数据, 为应用程序提供串行通信功能。MSComm 控件提供下列两种处理通信的方式: 事件驱动方式和查询方式。
  (1) 事件驱动方式
  事件驱动通信是处理串行端口交互作用的一种非常有效的方法。在许多情况下, 在事件发生时需要得到通知, 例如, 在串口接收缓冲区中有字符, Carrier Detect 或Request To Send 线上的一个字符到达或一个变化发生时。在这种情况下可以利用MSComm 控件的OnComm 事件捕获并处理这些通信事件。
  OnComm 事件还可以检查和处理通信错误, 以及所有通信事件和通信错误的列表。
  (2) 查询方式
  查询方式实质上还是事件驱动, 但在有些情况下, 这种方式显得更为便捷。在程序的每个关键功能之后, 可以通过检查CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的, 这种方法可能是更可取的。通过比较故采用的是事件驱动方式。
  2.2 MSComm 控件属性
  CommPort 属性:用于设置或返回串口号连接的串行端口号,Windows 将会利用该串口和外界通信。默认值为1,即对COM1 进行操作,最大值为16.
  Settings 属性:以字符串的形式设置或返回串口通信参数。包括串口通信的比特率,奇偶校验,数据位长度、停止位等。其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8 位数据位,1 个停止位。
  PortOpen 属性:设置或返回串口状态。值为True 时打开串口,值为False 时关闭串口。
  InPut 属性:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。寄存器的特性是先进先出。
   属性:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
  InBufferSize 属性:设置或返回接收缓冲区的大小,缺省值为1024 字节。
  Inputlen 属性:设置或返回一次从接收缓冲区中读取字节数。
  Input Mode 属性:设置或返回接收数据的类型。若值为0时则表示以文本形式读取;若值为1 时则表示以二进制形式读取。通常PLC 和PC 构成的通信系统都采用二进制接收方式。
  InBuffer Count 属性:设置或返回接收缓冲区中等待计算机接收的字符数。当将其值设为0 时,则输入寄存器将被清空。
  OutBufferSize 属性:设置或返回发送缓冲区的大小,缺省值为512 字节。
  OutBufferCount 属性:设置或返回发送缓冲区中等待计算机发送的字符数。当将其值设为0 时,则输出寄存器将被清空。
  Rthreshold 属性:该属性为一阀值。当接收缓冲区中字符数达到该值时, MSComm 控件设置Commevent 属性为ComEvReceive,并产生OnComm 事件。用户可在OnComm 事件处理程序中进行相应处理。若Rthreshold 属性设置为0,则不产生OnComm 事件。
  SThreshold 属性:在发生OnComm 事件之前传输缓冲区中的最小字符数。MSComm1.SThreshold = 0 数据传输事件不产生OnComm 事件;若设MSComm1.RThreshold = 1 则表示传输\ 缓冲区全空时, MSComm 控件产生OnComm 事件。
  Handshaking 属性:设置或返回硬件握手协议, 0 表示没有握手协议, 不考虑流量控制;1 表示在数据流中嵌入控制符来进行流量控制; 2 表示由信号线RTS 自动进行流量控制; 3 表示1、2 两者皆可。
  通信初始化程序如下:
  If MSComm1.PortOpen && True Then
  MSComm1.PortOpen=True
  End If
  mPort = 1
  MSComm1.Settings=“ 9600,N,8,1”
  MSComm1.InputLen=0
  MSComm1.InBufferCount=0
  MSComm1.InputMode=comInputMode Binary
  MSComm1. RThreshold =1
  MSComm1.Handshaking=comNone
技术资料出处:电子爱好者博客
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
12345678910
无线通讯的频谱有限,分配非常严格,相同频宽的电磁波只能使用一次,为了解决僧多粥少的难题,工程师研发出许多“调变技术”(ModulaTIon)与“多工技术”(MulTIplex),来增加频谱效率,因此才有了 3G、4G、5G 不同通讯世代技术的发明,那么在我们的手机里,是什...[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科【求助】msp430f5438a的串口发数有乱码,加电阻就好了!!...
本帖最后由 guxingganyue 于
11:02 编辑
如题:msp430f5438a,外接20M晶振,单片机跑115200。
我在while1中连续发一个字符串,但是每隔3次左右就会出现一堆乱码。即使单片机不发数,串口也收到连续的乱码。
现在我在收发两条线间接了一个4.7k的电阻,没有出现乱码了。即使单片机不发数,电脑串口也不会收到数据了。
这个现象我以前也遇到过一次,在avr单片机上,后来也没细究。今天又遇到了,特来请教各位有没有遇到过,为什么加电阻就好了呢?
下面是我的msp430f5438a初始化代码(按照官方的代码稍做了扩展):
void UART0_Init(uint32_t BandRate)
{
&&P3SEL = 0x30;& && && && && &&&// P3.4,5 = USCI_A0 TXD/RXD
&&//UCA0CTL0&&= 0x00;//这句话不要,因为复位后的状态就是这样:8位数据,1位停止位,无奇偶校验,异步串口模式
&&UCA0CTL1 |= UCSWRST;& && && & // Put state machine in reset
&&UCA0CTL1 |= UCSSEL_2;& && && &// 时钟选择:ACLK
&&if (BandRate==9600)//9600=&UCA0BRx=3
&&{
& & UCA0BR1 = 0x08;//高8位
& & UCA0BR0 = 0x23;//低8位,20MHz 9600 (see User's Guide)
& & UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else if (BandRate==19200)//19200=&UCA0BRx=1
&&{
& & UCA0BR1 = 0x04;//高8位
& & UCA0BR0 = 0x11;//低8位,20MHz 19200 (see User's Guide)
& & UCA0MCTL |= UCBRS_6 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else if (BandRate==38400)//38400=&UCA0BRx=520=0x0208
&&{
& & UCA0BR1 = 0x02;//高8位
& & UCA0BR0 = 0x08;//低8位,20MHz 38400 (see User's Guide)
& & UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else if (BandRate==57600)//57600=&UCA0BRx=347=0x015B
&&{
& & UCA0BR1 = 0x01;//高8位
& & UCA0BR0 = 0x5B;//低8位,20MHz 57600 (see User's Guide)
& & UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else if (BandRate==115200)//115200=&UCA0BRx=173=0xAD
&&{
& & UCA0BR1 = 0;//高8位
& & UCA0BR0 = 0xAD;//低8位,20MHz 115200 (see User's Guide)
& & UCA0MCTL |= UCBRS_5 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else if(BandRate==230400)//230400=&UCA0BRx=86=0x56
&&{
& & UCA0BR1 = 0;//高8位
& & UCA0BR0 = 0x56;//低8位,20MHz 230400 (see User's Guide)
& & UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
&&}
&&else//9600
&&{
&&UCA0CTL1 &= ~UCSWRST;& && && &// **Initialize USCI state machine**
&&//UCA0IE |= UCRXIE;& && && && & // Enable USCI_A0 RX interrupt
}复制代码我还遇到一个奇怪的现象,现在是准解决了,但还是不放心。
msp430f5438a外接25M,20M晶振,没有接32768晶振。ACLK=SMCLK=MCLK=XT2CLK
发现手一摸那个晶振单片机就死机了,但是我量时钟输出管脚,频率都是对的,说明单片机没有死机。
后来看官方的代码时发现有下面的这个中断:#pragma vector=UNMI_VECTOR
__interrupt void NMI_ISR(void)
{
&&uint16_t status=0;
&&do
&&{
& & // If it still can't clear the oscillator fault flags after the timeout, trap and wait here.
& & status = Clear_All_Osc_Flags(1000);
&&} while(status != 0);
}复制代码我把它加上后硬件仿真(上述代码中加断点),手摸几下后发现单片机跑到它里面去了,执行几遍后单片机又好了。。。原来是时钟有错误中断,我没清。。
大家有没有遇到这个现象,为什么手摸几下就这样了呢,以前还从没遇到过。。这种现象怎么解决呢(最好不要用上述的代码从软件上解决,因为这样单片机会小“死”一会的)
先谢谢大家了
看来大家没有遇到过啊
我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据里面就有几十个,而且是连着的几十个,后面又恢复了!真奇怪,我晚上试试串电阻测试下。
我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据 ...
包好,不信可以试试啊
楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢?
楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢?
地都接了,但是我用同样方法在149上就没有问题
我今天也遇到这样的情况啦&&是串一电阻&&还是接上拉电阻啊&&串电阻好像有点大了
我今天也遇到这样的情况啦&&是串一电阻&&还是接上拉电阻啊&&串电阻好像有点大了 ...
就是在R 和 T 间接一个电阻即可
就是在R 和 T 间接一个电阻即可
楼主&&你的方案有点错误,&&只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO口& &是MOS管的, 所以需要接上拉&&不然会乱码的& &
楼主&&你的方案有点错误,&&只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO ...
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗?
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗?
这只能是一种限流的作用& &在一定程度上防止了一些干扰& &但是当你频率越高的时候&&就不行啦& &还是会有乱码& &特别是你用的晶振频率很高的时候
这只能是一种限流的作用& &在一定程度上防止了一些干扰& &但是当你频率越高的时候&&就不行啦& &还是会有 ...
哦,那怎么能彻底解决这个问题呢
我以前在AVR上也遇到过
但是在stm32和lpc2132上没有遇到。
哦,那怎么能彻底解决这个问题呢
我以前在AVR上也遇到过
加上拉 啊&&强制上拉&&就可以啦
加上拉 啊&&强制上拉&&就可以啦
以前也是两根线间接了一个电阻就好了
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗?
当然算上拉了,T无数据是什么电平?
这个办法,全双工就没了
加一定大小的上拉电阻,用于阻抗匹配,减少反射,避免震荡,保证稳定性,但是你俩线间加电阻的方法应该是一种缓解,并没有实质解决问题。
学习了,一般情况下都是加上拉电阻
单片机的发送加上拉电阻,4.7k,10K都可以
阿莫电子论坛, 原"中国电子开发网"MSP430单片机串口的程序升级方法--《单片机与嵌入式系统应用》2011年10期
MSP430单片机串口的程序升级方法
【摘要】:介绍了一种MSP430单片机通过串口升级程序的方法,并在MSP430F5438上得以实现。通过实验,证明此方法稳定、可靠,避免了利用仿真器更新程序的繁琐,提高了效率。
【作者单位】:
【关键词】:
【分类号】:TP368.1【正文快照】:
随着性能的不断提高以及成本的降低,单片机在各个领域都得到了广泛的应用。尤其在信号的控制和处理方面,单片机以其超低的功耗、简单的操作成为设计者的首选[1]。TI公司推出的MSP430x5xx系列单片机具有低电压、低功耗、高速处理能力以及配置灵活的接口等特点[2],是当今主流单
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【参考文献】
中国期刊全文数据库
何立民;[J];单片机与嵌入式系统应用;2002年05期
【共引文献】
中国期刊全文数据库
刘志京;;[J];北京印刷学院学报;2010年06期
胡进德;刘祖云;徐国洪;;[J];重庆职业技术学院学报;2007年05期
吴艳辉;陈勇;;[J];电力科学与工程;2008年09期
严干贵;周军;车晓涛;肖龙章;王磊;张正茂;;[J];电力自动化设备;2006年09期
严干贵;李果雪;张正茂;肖龙章;曹军;穆钢;戴武昌;;[J];电力自动化设备;2007年03期
李珍;[J];单片机与嵌入式系统应用;2002年11期
周根荣;姜平;李俊红;;[J];电气电子教学学报;2006年05期
李珍;张容;;[J];电气自动化;2003年03期
张江;戴居丰;;[J];电子测量技术;2007年03期
,杨术轩;[J];电子产品世界;2002年20期
中国重要会议论文全文数据库
张忠华;;[A];第三届全国嵌入式技术和信息处理联合学术会议论文集[C];2009年
姚凯学;郭强;;[A];第三届全国信息获取与处理学术会议论文集[C];2005年
王文静;杜高明;;[A];全国第21届计算机技术与应用学术会议(CACIS·2010)暨全国第2届安全关键技术与应用学术会议论文集[C];2010年
中国硕士学位论文全文数据库
田健;[D];电子科技大学;2010年
张军;[D];太原理工大学;2010年
姜云桥;[D];哈尔滨工程大学;2009年
刘诚;[D];哈尔滨工业大学;2009年
张晋华;[D];苏州大学;2009年
贾云芳;[D];太原科技大学;2010年
秦承志;[D];中国海洋大学;2010年
陈培料;[D];华东师范大学;2010年
于宏新;[D];东华大学;2011年
苏杉;[D];中国石油大学;2011年
【相似文献】
中国期刊全文数据库
邢矫健;[J];电子世界;2003年11期
赵亮;;[J];电子制作;2008年11期
郑丰隆;[J];微电脑世界;1995年01期
於丹;[J];微电脑世界;1998年17期
笑天;[J];电脑技术;2001年08期
尹海昌;李建新;;[J];信息工程大学学报;2006年04期
张嵩;王剑;;[J];湖北工业大学学报;2006年03期
马喜顺;[J];电子产品世界;1999年01期
周舒;[J];电子科技大学学报;2000年06期
洪家平;[J];微计算机信息;2005年03期
中国重要会议论文全文数据库
范小兰;;[A];第七届全国信息获取与处理学术会议论文集[C];2009年
李光亚;;[A];2008'中国信息技术与应用学术论坛论文集(一)[C];2008年
张峰;杜尚丰;赵亮;;[A];中国高等学校电力系统及其自动化专业第二十四届学术年会论文集(下册)[C];2008年
唐卫红;曹金荣;李汉军;郑晓慧;杨士亮;;[A];第六届全国信息获取与处理学术会议论文集(2)[C];2008年
王怀瑞;顼庆坤;;[A];中国自动化学会全国第九届自动化新技术学术交流会论文集[C];2004年
杨剑平;刘淳;任广林;;[A];江苏省通信学会2004年学术年会论文集[C];2004年
关宇东;付贵华;陈华;;[A];第一届中国高校通信类院系学术研讨会论文集[C];2007年
周栋;马刚;闫广;;[A];第十三届全国煤矿自动化学术年会、中国煤炭学会自动化专业委员会学术会议论文集[C];2003年
黄贤超;宓方玮;;[A];四川省电子学会传感技术第九届学术年会论文集[C];2005年
徐志远;凌志浩;;[A];第七届工业仪表与自动化学术会议论文集[C];2006年
中国重要报纸全文数据库
曾凡若;[N];电子报;2003年
王巧红;[N];中国电脑教育报;2001年
范晓峰;[N];中国电脑教育报;2001年
王旭东;[N];电子报;2005年
学友;[N];电子报;2005年
刘红辉;[N];电子报;2003年
阿涛;[N];湖北科技报;2003年
王强;[N];电子报;2002年
欧阳明星;[N];电子报;2003年
广东 张则;[N];电子报;2010年
中国硕士学位论文全文数据库
蒋海英;[D];西南交通大学;2009年
毕振兴;[D];天津大学;2007年
白雪峰;[D];吉林大学;2009年
闵浩;[D];武汉科技大学;2011年
郑晓霞;[D];内蒙古大学;2009年
慈艳柯;[D];厦门大学;2002年
查斌;[D];武汉理工大学;2009年
何汶静;[D];电子科技大学;2008年
谭庆龙;[D];湖南师范大学;2008年
王哲;[D];新疆大学;2004年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号使用Msp430的串口中断接收一包数据
使用Msp430的串口中断接收一包数据[转帖]
假设有一数据包,数据格式如表所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
长度(字节)
数据包头(STX)
常量:0x02
数据单元长度(Data_len)
需传输的数据单元Data部分的长度,高字节在前,低字节在后。
例如:0x0010表示Data部分有16个字节。
需传输的数据单元(Data)
长度由Data_len指出,数据单元头两个字节是命令码(终端发送命令到读写器)或状态码(读写器返回数据给终端),后面是其它参数。
冗余检验值(LRC)
Data部分数据各字节异或值。
数据包尾(ETX)
常量:0x03
数据包总长度为: Data_len + 5 字节,最长不能超过512字节。
程序实现如下所示:
typedef&struct&newStruct&&
{&&&&&&&&&&&&
&&&&&&unsigned&char&startF&&
&&&&&&unsigned&char&finishF&&
&&&&&&unsigned&char&lenHighF&&
&&&&&&unsigned&char&lenLowF&&
&&&&&&unsigned&char&dataF&&
&&&&&&unsigned&char&lrcF&&
&&&&&&unsigned&char&buf[512];&&
&&&&&&unsigned&char&lenH&&
&&&&&&unsigned&char&lenL&&
&&&&&&unsigned&char&dataStartI&&
&&&&&&unsigned&short&&&
&&&&&&unsigned&short&&&
&&&&&&unsigned&short&tempL&&
rxstruct&rxA&&
void&m430_InitUart()&&
&&&&&&P3SEL&|=&BIT4|BIT5;&&&&&&&&&&&//&P3.4,&P3.5&=&USCI_A0&TXD/RXD
&&&&&&UCA0CTL1&|=&UCSSEL_2;&&&&&&&&&&//&SMCLK
&&&&&&//以下三行为波特率设置使用
&&&&&&UCA0BR1&&=&0;&&&
&&&&&&UCA0BR0&&=&104;&&&&&&&&&//&12MHz:,625-&-&-&-&115200&&&&&&&&&&&&&
&&&&&&UCA0MCTL&=&0x02;&&&&&&&&&//&Modulation&UCBRSx&=&1
&&&&&&UCA0CTL1&&=&~UCSWRST;&&&&//&Initialize&USCI&state&machine&
&&&&&&//IE2&|=&UCA0RXIE&|&UCA0TXIE;&&//注意应在初始化USCI之后,设置中断使能,否则不起作用,即若此句放在UCA0CTL1&&=&~UCSWRST;之前,则不会响应中断
&&&&&&IE2&|=&UCA0RXIE;&&
unsigned&char&uart_CalLrc(unsigned&char&*buf,&unsigned&short&len)&&
&&&&&&unsigned&short&i;&&
&&&&&&unsigned&char&&&
&&&&&&lrc&=&0x00;&&
&&&&&&for(&i=0;&i
&&&&&&{&&&&&&&&&&&&
&&&&&&&&&&lrc&^=&buf[i];&&
&&&&&&return&&&
void&main()&&
&&&&&&WDTCTL&=&WDTPW&+&WDTHOLD;&&
&&&&&&BCSCTL1&=&CALBC1_12MHZ;&&
&&&&&&DCOCTL&&=&CALDCO_12MHZ;&&
&&&&&&m430_InitUart();&&
&&&&&&rxArray.startFlag&=&0;&&&&&&&&&&&&&&
&&&&&&rxArray.finishFlag&=&0;&&
&&&&&&_EINT();&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&_BIS_SR(LPM4_bits);&&
&&&&&&while(1)&&
&&&&&&{&&&&&&&&&&&&
#pragma&vector&=&USCIAB0RX_VECTOR
__interrupt&void&uartRxHandle()&&
&&&&&&unsigned&char&&&&&&&&&
&&&&&&num&=&UCA0RXBUF;&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&if(&0==rxArray.startFlag&)//判断是否接收到帧头
&&&&&&&&&&&&if(&0x02==num&)//判断帧头是否正确
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&rxArray.startFlag&=&1;//标志已经接收到帧头
&&&&&&&&&&&&&&&&rxArray.finishFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenHighFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenLowFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.dataFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lrcFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.index&=&0;&&
&&&&&&&&&&&&&&&&rxArray.len&=&0;//存储帧长度
&&&&&&&&&&&&&&&&rxArray.buf[rxArray.index]&=&&&
&&&&&&&&&&&&&&&&rxArray.index++;&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&if(&0==rxArray.lenHighFlag&)//判断是否接收到帧长度的高字节信息
&&&&&&&&&&&&rxArray.lenHighFlag&=&1;//标志已经接收到帧长度的高字节
&&&&&&&&&&&&rxArray.lenHigh&=&rxArray.buf[rxArray.index]&=&&&
&&&&&&&&&&&&rxArray.index++;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&if(&0==rxArray.lenLowFlag&)//判断是否接收到帧长度的低字节信息
&&&&&&&&&&&&rxArray.lenLowFlag&=&1;//标志已经接收到帧长度的低字节
&&&&&&&&&&&&rxArray.lenLow&=&rxArray.buf[rxArray.index]&=&&&
&&&&&&&&&&&&rxArray.index++;&&
&&&&&&&&&&&&rxArray.dataStartIndex&=&rxArray.&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&rxArray.tempLen&=&rxArray.len&=&(rxArray.lenHigh&&8)&+&rxArray.lenL//增加一字节的帧尾
&&&&&&&&&&&&if(&rxArray.len+5&512&)//如果数据长度大于12,则说明接收的数据长度信息有误,需要重新接收
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&rxArray.startFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenHighFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenLowFlag&=&0;&&
&&&&&&&&&&&&}&&&&&&&
&&&&&&&&&&&&&&
&&&&&&if(&0==rxArray.dataFlag&)&&
&&&&&&&&&&&&rxArray.buf[rxArray.index]&=&//把数据存放到数组中
&&&&&&&&&&&&rxArray.index++;&&
&&&&&&&&&&&&rxArray.tempLen--;&&
&&&&&&&&&&&&if(&0==rxArray.tempLen&)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&rxArray.dataFlag&=&1;&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&if(&0==rxArray.lrcFlag&)//接收lrc
&&&&&&&&&&&&rxArray.buf[rxArray.index]&=&&&
&&&&&&&&&&&&rxArray.index++;&&
&&&&&&&&&&&&rxArray.lrcFlag&=&1;&&
&&&&&&&&&&&&if(&0!=uart_CalLrc(&&rxArray.buf[rxArray.dataStartIndex],&rxArray.len+1&)&)//判断接收数据的lrc是否正确
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&rxArray.startFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenHighFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lenLowFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.dataFlag&=&0;&&
&&&&&&&&&&&&&&&&rxArray.lrcFlag&=&0;&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&rxArray.buf[rxArray.index]&=&&&&&&&&
&&&&&&rxArray.finishFlag&=&1;&&
&&&&&&rxArray.startFlag&=&0;&&
&&&&&&rxArray.lenHighFlag&=&0;&&
&&&&&&rxArray.lenLowFlag&=&0;&&
&&&&&&rxArray.dataFlag&=&0;&&
&&&&&&rxArray.lrcFlag&=&0;&&&&&&&&
&&&&&&if(&rxArray.buf[rxArray.index]!=0x03&)//最后一个字节不是0x03,说明数据有误,需要重新接收
&&&&&&{&&&&&&&&&&&&&&&
&&&&&&&&&&&&rxArray.finishFlag&=&0;&&&&&&&&&&&&&&&
&&&&&&}&&&&&
&&&&&&if(&rxArray.finishFlag&)&&
&&&&&&&&&&&&//收到数据处理部分&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
本程序一个致命的bug就是,如果长度信息那两个字节的数据接收时出现错误,会导致不能正确组成一包数据,后面发送过来的数据包也不能正确接收。
如有一包数据(16进制):02 00 02 11 11 00 03,
如果接收过程出现错误,导致将长度的两个字节00 02在接收端变成了00
05,因此接收端会等待接收完5个字节的数据之后才认为完整的接收完一包数据,从而导致后面发送过来的完整的数据包的一部分会被拆分,周而复始的这样恶性循环下去,暂时还没想到好的解决办法!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MSP430单片机串口通信详解
16:04:38来源: 51hei
#include"msp430G2553.h"
#include "in430.h"
void UartPutchar(unsigned char c);
unsigned char UartGetchar();
unsigned char temp=0;
unsigned char number[2]={0};
void main( void )
& WDTCTL = WDTPW + WDTHOLD; & & & & & & & & // Stop WDT
& BCSCTL1 = CALBC1_1MHZ; & & & & & & & & & &// Set DCO
& DCOCTL = CALDCO_1MHZ;
& P1DIR|=BIT6;
& P1OUT&=~BIT6;
& P1SEL = BIT1 + BIT2; & & & & & & & & & & &// P1.1为 RXD, P1.2为TXD
& P1SEL2 = BIT1 + BIT2; & & & & & & & & & & // P1.1为 RXD, P1.2为TXD
& UCA0CTL1 |= UCSSEL_2; & & & & & & & & & & // 选择时钟BRCLK
& UCA0BR0 = 106; & & & & & & & & & & & & & &// 1MHz 9600
& UCA0BR1 = 0; & & & & & & & & & & & & & & &// 1MHz 9600
& UCA0MCTL = UCBRS2 + UCBRS0; & & & & & & & // 波特率=BRCLK/(UBR+(M7+...0)/8)
& UCA0CTL1 &= ~UCSWRST; &
& // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断
& IE2 |= UCA0RXIE; & & & & & & & & & & & & &// 使能接收中断
& &//UartPutchar(9);
& &// display_int(temp,0);
& & __delay_cycles(10000);
/**********************************UART接收中断*************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
& //while (!(IFG2&UCA0TXIFG)); & & & & & & & &// 等待发送完成
& //UCA0TXBUF = UCA0RXBUF; & & & & & & & & & &// TX -> RXed character
& temp=UCA0RXBUF;
/******************************UART发送字节函数*************************/
void UartPutchar(unsigned char c)
&while(!(IFG2 & UCA0TXIFG)); &//待发送为空
&UCA0TXBUF=c;
&IFG2 &=~UCA0RXIFG;
/*********************************UART接收字节数据******************/
unsigned char UartGetchar()
& while(!(IFG2 & UCA0RXIFG)); //等待接收完成
& c=UCA0RXBUF;
& IFG2 &=~UCA0TXIFG;
/******智能控制工作室*******/
&&&MSP430g2553串口通信
MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。
串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。
一、UART模式
在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。
(一)UART的初始化
单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。
通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL
数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。
接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号:URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。
关键字:&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

我要回帖

更多关于 msp430f169单片机 的文章

 

随机推荐