为什么MSP430串口1接收串口2发送发送30,接收到是144

NRF24L01 MSP430发送接收程序
我的图书馆
NRF24L01 MSP430发送接收程序
NRF24L01 MSP430发送接收程序
&&&&&& 最近弄了几天的无线模块,玩的是NRF2L01,因为这款无线模块价格便宜,网上也就卖10多块钱!刚开始用51写,“百度一下”发现网上的程序真是百篇一律,你抄我,我抄你。对比了几个程序之后,发现他们的程序注释也是自相矛盾,看了的唯一收获就是,结合技术资料,对NRF24L01的工作模式和通信过程有了个总体的把握。
&&&&&& 用51调了几次没成功,改而用430板子来写。在网上查了一些相关的程序,终于成功了。现在发现其实要写对NRF24L01的基本通信程序并不难,当然要玩转它又是另外一回事了。我也刚刚才玩会单通道接收发送这个工作模式,其他的工作模式还没玩!还是附上相应的程序供大家学习交流,当然程序可能难免还有疏漏和错误,还望比拼指出!
&&& 这是NRF24L01的头文件配置程序:
#include &msp430x14x.h&
//=======================NRF24L01_CE端口=========================================
#define& RF24L01_CE_0&&&&&&& P3OUT &=~BIT1&&&&&&&& #define& RF24L01_CE_1&&&&&&& P3OUT |= BIT1&&&&&&& //=============================RF24L01_CSN端口==================================#define& RF24L01_CSN_0&&&&&& P3OUT &=~BIT3&&&&&&&& #define& RF24L01_CSN_1&&&&&& P3OUT |= BIT3&&&& //=============================RF24L01_SCK端口======================================#define& RF24L01_SCK_0&&&&&& P3OUT &=~BIT2&&&&& #define& RF24L01_SCK_1&&&&&& P3OUT |= BIT2&& //=============================RF24L01_MISO端口=========================================#define& RF24L01_MISO_0&&&&& P3OUT &=~BIT0#define& RF24L01_MISO_1&&&&& P3OUT |= BIT0//============================= RF24L01_MOSI端口================================#define& RF24L01_MOSI_0&&&&& P2OUT &=~BIT6#define& RF24L01_MOSI_1&&&&& P2OUT |= BIT6//==========================IRQ状态============================================#define& RF24L01_IRQ_0&&&&&& P2OUT &=~BIT7&&&&&& #define& RF24L01_IRQ_1&&&&&& P2OUT |= BIT7//==========================NRF24L01地址,接收发送数据长度============================================#define TX_ADR_WIDTH&&& 5&& &// 5 uints TX address width&&&
#define RX_ADR_WIDTH&&& 5&& &// 5 uints RX address width#define TX_PLOAD_WIDTH& 32& &// 32 TX payload&&&&&&&&&&&&&&&&& //这里可以更改你想要发送和接收的数据长度& 如果是发指令 我喜欢越短越好#define RX_PLOAD_WIDTH& 32& &// 32 uints TX payload//=========================NRF24L01寄存器指令===================================#define READ_REG&&&&&&& 0x00& &// 读寄存器指令#define WRITE_REG&&&&&& 0x20 &// 写寄存器指令#define RD_RX_PLOAD&&&& 0x61& &// 读取接收数据指令#define WR_TX_PLOAD&&&& 0xA0& &// 写待发数据指令#define FLUSH_TX&&&&&&& 0xE1 &// 冲洗发送 FIFO指令#define FLUSH_RX&&&&&&& 0xE2& &// 冲洗接收 FIFO指令#define REUSE_TX_PL&&&& 0xE3& &// 定义重复装载数据指令#define NOP1&&&&&&&&&&& 0xFF& &// 保留//========================SPI(nRF24L01)寄存器地址===============================#define CONFIG&&&&&&&&& 0x00& // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA&&&&&&&&&& 0x01& // 自动应答功能设置#define EN_RXADDR&&&&&& 0x02& // 可用信道设置#define SETUP_AW&&&&&&& 0x03& // 收发地址宽度设置#define SETUP_RETR&&&&& 0x04& // 自动重发功能设置#define RF_CH&&&&&&&&&& 0x05& // 工作频率设置#define RF_SETUP&&&&&&& 0x06& // 发射速率、功耗功能设置#define STATUS&&&&&&&&& 0x07& // 状态寄存器#define OBSERVE_TX&&&&& 0x08& // 发送监测功能#define CD&&&&&&&&&&&&& 0x09& // 地址检测&&&&&&&&&& #define RX_ADDR_P0&&&&& 0x0A& // 频道0接收数据地址#define RX_ADDR_P1&&&&& 0x0B& // 频道1接收数据地址#define RX_ADDR_P2&&&&& 0x0C& // 频道2接收数据地址#define RX_ADDR_P3&&&&& 0x0D& // 频道3接收数据地址#define RX_ADDR_P4&&&&& 0x0E& // 频道4接收数据地址#define RX_ADDR_P5&&&&& 0x0F& // 频道5接收数据地址#define TX_ADDR&&&&&&&& 0x10& // 发送地址寄存器#define RX_PW_P0&&&&&&& 0x11& // 接收频道0接收数据长度#define RX_PW_P1&&&&&&& 0x12& // 接收频道0接收数据长度#define RX_PW_P2&&&&&&& 0x13& // 接收频道0接收数据长度#define RX_PW_P3&&&&&&& 0x14& // 接收频道0接收数据长度#define RX_PW_P4&&&&&&& 0x15& // 接收频道0接收数据长度#define RX_PW_P5&&&&&&& 0x16& // 接收频道0接收数据长度#define FIFO_STATUS&&&& 0x17& // FIFO栈入栈出状态寄存器设置//=============================RF24l01状态=====================================char& TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};&//本地地址&&&
&//我刚开始学的时候对这个发送和接收地址不是很明白,为什么他要设置成这样,后来才知道这个地址是用户自己定的,也就是说不是每个芯片只有唯一的地址,只要发送和接收端的地址一致就行char& RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};&//接收地址char&char TxBuf[32]={0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,};&&&&&&&&&&&&&& //这个程序要发送的数据
void RF24L01_IO_set(void);void ms_delay(void);void InitSys();void Delay(int s);char SPI_RW(char data);char SPI_Read(char reg);char SPI_RW_Reg(char reg, char value);char SPI_Read_Buf(char reg, char *pBuf, char uchars);char SPI_Write_Buf(char reg, char *pBuf, char uchars);void SetRX_Mode(void);char nRF24L01_RxPacket(char* rx_buf);void nRF24L01_TxPacket(char * tx_buf);void init_NRF24L01(void);//===========================RF24L01端口设置==========================================void RF24L01_IO_set(void){&&&&& P2DIR &= 0x7f;&&& P2DIR |= 0x40;& P2SEL&=0x3F;&& P2IE=P2IE&0x3f;&&&&& P3DIR &= 0xFE;&&& P3DIR |= 0x0E;& P3SEL&=0xF0;}
//******************************************************************************//系统初始化&& 打开430XT2晶振//******************************************************************************void InitSys(){&& unsigned int iq0;&& _DINT();&& BCSCTL1 &=~XT2OFF;&& do&& {&&&&& IFG1 &= ~OFIFG;&&&&&&&&&& // 清除振荡器失效标志&&&&& for (iq0 = 0xFF; iq0 & 0; iq0--);& // 延时,等待XT2起振&& }&& while ((IFG1 & OFIFG) != 0);&& // 判断XT2是否起振&&&& BCSCTL2 =SELM1+SELS;&&&&&&&&&&&&&&&&& // MCLK,SMCLK时钟为XT2&&}//========================延时约5ms=============================================void ms_delay(void){ && unsigned int i=40000;&&& while (i != 0)&&& {&&&&&&& i--;&&& }}//========================================长延时================================void Delay(int s){&unsigned int i,j;&for(i=0; i&s; i++);&for(j=0; j&s; j++);}//******************************************************************************************//延时函数//******************************************************************************************void inerDelay_us(char n){&for(;n&0;n--);}//==============================================================================//函数:uint SPI_RW(uint uchar)//功能:NRF24L01的SPI写时序//******************************************************************************char SPI_RW(char data){&char i,temp=0;&& &for(i=0;i&8;i++)&&&&&&&&&&&&&& // output 8-bit&& &{&&&&&&&&& if((data & 0x80)==0x80)&&&&&&&&& {&&&&&&&&&&&&& RF24L01_MOSI_1;&&&&&&&&& // output 'uchar', MSB to MOSI&&&&&&&&& }&&&&&&&&& else&&&&&&&&& {&&&&&&&&&&&&& RF24L01_MOSI_0; &&&&&&&&& }&&&&&&&&&& data = (data && 1);&&&&&&&&& // shift next bit into MSB..&&&&&&&&& temp&&=1;&&&&&&&&& RF24L01_SCK_1;&&&&&&&&&&&&&& // Set SCK high..&&&&&&&&& if((P3IN&0x01)==0x01)temp++;&&&&&&&& // capture current MISO bit&&&&&&&&& RF24L01_SCK_0;&&&&&&&&&&&&&& // ..then set SCK low again&& &}&&& return(temp);&&&&&&&&&& &&&&&&& // return read uchar}//****************************************************************************************************//函数:uchar SPI_Read(uchar reg)//功能:NRF24L01的SPI时序//****************************************************************************************************char SPI_Read(char reg){&char reg_&RF24L01_CSN_0;&&&&&&&&&& // CSN low, initialize SPI communication...&SPI_RW(reg);&&&&&&&&&&&& // Select register to read from..&reg_val = SPI_RW(0);&&&& // ..then read registervalue&RF24L01_CSN_1;&&&&&&&&&& // CSN high, terminate SPI communication&return(reg_val);&&&&&&&& // return register value}//****************************************************************************************************///功能:NRF24L01读写寄存器函数//****************************************************************************************************/char SPI_RW_Reg(char reg, char value){&char status1;&RF24L01_CSN_0;&&&&&&&&&&&&&&&&&& // CSN low, init SPI transaction&status1 = SPI_RW(reg);&&&&&&&&&& // select register&SPI_RW(value);&&&&&&&&&&&&&&&&&& // ..and write value to it..&RF24L01_CSN_1;&&&&&&&&&&&&&&&&&& // CSN high again&return(status1);&&&&&&&&&&&&&&&& // return nRF24L01 status uchar}//****************************************************************************************************///函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数//****************************************************************************************************/char SPI_Read_Buf(char reg, char *pBuf, char chars){&char status2,uchar_&RF24L01_CSN_0;&&&&&&&&&&&&&&&&&&&&&&&&& // Set CSN low, init SPI tranaction&status2 = SPI_RW(reg);&&&&&& &&// Select register to write to and read status uchar&for(uchar_ctr=0;uchar_ctr&uchar_ctr++)&&&&&&& {&& pBuf[uchar_ctr] = SPI_RW(0);&&& &&&&&&& }&RF24L01_CSN_1;&&&&&&&&&&&&&&&&&&&&&&&&&& &return(status2);&&&&&&&&&&&&&&&&&&&&&& // return nRF24L01 status uchar}//*********************************************************************************************************//函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于写数据& reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数//*********************************************************************************************************/char SPI_Write_Buf(char reg, char *pBuf, char chars){&char status1,uchar_&RF24L01_CSN_0;&&&&&&&&&&&& //SPI使能&&&&&& &status1 = SPI_RW(reg);&& &for(uchar_ctr=0; uchar_ctr& uchar_ctr++) &&&&&&& {&&SPI_RW(*pBuf++);&&&&&&& }&RF24L01_CSN_1;&&&&&&&&&&&& //关闭SPI&return(status1);&&& &&& }//****************************************************************************************************///函数:void SetRX_Mode(void)//功能:数据接收配置 //****************************************************************************************************/void SetRX_Mode(void){&RF24L01_CE_0;&SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);&&&&& // IRQ收发完成中断响应,16位CRC,主接收&RF24L01_CE_1; &inerDelay_us(130);&&&&&&&&&&&&&&&&&&&&&&&& //注意不能太小}//******************************************************************************************************///函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//功能:数据读取后放如rx_buf接收缓冲区中//******************************************************************************************************/char nRF24L01_RxPacket(char* rx_buf){&&& char revale=0;&&& sta=SPI_Read(STATUS);&&&&& // 读取状态寄存其来判断数据接收状况&&&&& if(sta&0x40)&&&&&&&&&&&&&&&&&&&& // 判断是否接收到数据&&& {&&&&&&& RF24L01_CE_0 ; &&&&&&&&&&&&& //SPI使能&&&&&&& SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);&&& // read receive payload from RX_FIFO buffer&&&&&&& revale =1;&&&&&&&&&&&&&&&&&&&&&& //读取数据完成标志&&& }&&& SPI_RW_Reg(WRITE_REG+STATUS,sta);&&&&&&&&&&&&&&&&&&&&&& //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志&&&}//***********************************************************************************************************//函数:void nRF24L01_TxPacket(char * tx_buf)//功能:发送 tx_buf中数据//**********************************************************************************************************/void nRF24L01_TxPacket(char * tx_buf){&RF24L01_CE_0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //StandBy I模式&&SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址&SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); &&&&&&&&& // 装载数据&&& //&&&& SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);&& &&&&&&&&&& // IRQ收发完成中断响应,16位CRC,主发送&RF24L01_CE_1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //置高CE,激发数据发送&inerDelay_us(10);}//****************************************************************************************//NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){&& inerDelay_us(100);&&RF24L01_CE_0 ;&&&&& // chip enable&&RF24L01_CSN_1;&&&&& // Spi disable &&RF24L01_SCK_0;&&&&& // Spi clock line init high&SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);&&& // 写本地地址&&SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址&SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);&&&&& //& 频道0自动&ACK应答允许&&SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);& //& 允许接收地址只有频道0,如果需要多频道可以参考Page21& &SPI_RW_Reg(WRITE_REG + RF_CH, 0);&&&&&&&& //&& 设置信道工作为2.4GHZ,收发必须一致&SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节&SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);&& //设置发射速率为1MHZ,发射功率为最大值0dB&SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E);&&&& // IRQ收发完成中断响应,16位CRC&,主接收}}//=============================================================================
&&&& 下面是发送主程序:
#include &msp430x14x.h&
#include "NRF24L01.h"void main(){&&&& & WDTCTL = WDTPW + WDTHOLD;&&&& //禁止看门狗& RF24L01_IO_set();& InitSys();& init_NRF24L01() ;& nRF24L01_TxPacket(TxBuf);&//&&将要发送的数据转移到发送缓冲区
&& & while(1)& {
&&&&& nRF24L01_TxPacket(TxBuf);&&&&&& SPI_RW_Reg(WRITE_REG+STATUS,0XFF);&& //清状态寄存器&&&&& ms_delay();&&&&&&&&& &&&&& ms_delay();&&&&& LED1_1;&&&&& ms_delay();&&&&&&&&& &&&&& ms_delay();&&&&& LED1_0;& }}
& 下面是接收主程序: 将接收到的数据发送到PC 可以通过串口助手来查看接收到数据是否正确
#include &msp430x14x.h&
#include "NRF24L01.h"
char RxBuf[32]={0};
//===============================串口初始化=====================================void init_uart0(void){//====================串口工作模式设置========================================&&& U0CTL=0x00;&&&&& // U0CTL包含串口0通信协议、通信模式、校验位等设置,允许UART0&&& U0CTL +=CHAR;&&& //(CHAR=0x10)当CHAR=0时位7位数据,当 CHAR=1时为8位数据 &&&&&&&&&&&&&&&&&&&& //不需要校验,数据位为8位,无反馈,异步UART通信,UART被允许//====================串口发送操作设置========================================&&& U0TCTL=0x00;&&&& //U0TCTL包含串口0发送功能操作&&& U0TCTL +=SSEL0;& //波特率发生器选择ACLK &&&&&&&&&&&&&&&&&&&& //#define SSEL1& (0x20)&&&&&& #define SSEL0& (0x10)//====================串口拨特率设置9600====================================//===================拨特率计算公式:拨特率=BRCLK/(UBR+(M7+M6+。。。。+M0)/8)&&& UBR0_0=0x03;&&&& //UBR0_0为串口0波特率整数部分低地址 &&& UBR1_0=0x00;&&&& //UBR1_0为串口0波特率整数部分高地址 &&& UMCTL_0=0x4A;&&& //UBR1_0为串口0波特率小数部分高地址 //===================串口收发使能控制=========================================&&& ME1 |= UTXE0;&&& //串口0发送功能使能&&& ME1 |= URXE0;&&& //串口0接收功能使能&&& //===================串口中断使能控制=========================================//& IE1 |= URXIE0;&& //串口0接收中断使能//&& IE1 |= UTXIE0;&& //串口0发送中断使能//===================端口第二功能使能=========================================&&& P3SEL |=BIT4;&&& //设置P3.4为UART0 的TXD&&& P3SEL |=BIT5;&&& //设置P3.5为UART0 的RXD&&& P3DIR |=BIT4;&&& //设置P3.4为输出& }//=======================串口发送函数=======================================================void&& R_S_Byte(char R_Byte){&&& while((IFG1&UTXIFG0)==0);&&&& TXBUF0=R_B}//=============================================================================main(){&&&&&&&&&& WDTCTL = WDTPW + WDTHOLD; //禁止看门狗&&&&&&RF24L01_IO_set();&&&&&&InitSys();&&&& init_uart0();&&&&& init_NRF24L01();&&&&& while(1)&&&&& {&&&&&&&& SetRX_Mode();&&&&&&&& if(nRF24L01_RxPacket(RxBuf))&& //判断是否收到数据&
&&&&&&&&&&&&&&//&&NRF24L01在判断是否接收数据是可以通过中断引脚IRQ和内部& RX_DR,TX_DS,MAX_PT状态来判断,此处是后者,可以将IRQ引脚接到单片机中断口,通过中断来判断 推荐使用中断这样可以节约MCU消耗&&&&&&&&& {&& &&&&&&&&&&&&&& for(i=0;i&32;i++)&&&&&&& //收到数据后,串口显示&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&& {&&&&&&&&&&&&&&&&& R_S_Byte(RxBuf[i]);&&&&&&&&&&&&&&&&& Delay(30);&&&&&&&&&&&&&&& }&&&&&&&&&& }&&&&&&&&& ms_delay();&&&&& }}
注:由于这篇文章是在感觉很久没有在网上写点东西和刚刚调试好430的程序后发表的,仓促之时,难免会有书写错误,还望指出!
[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢msp430串口数据收发的讨论_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
msp430串口数据收发的讨论
你可能喜欢热门搜索:
您现在的位置是: &
> MSP430F149串口行实验程序
//使用ADC12采集实验,将采集到数据送向PC.(序列单次采集,采用定时器A作为时钟源)
//P3.4为发送,P3.5为接收 晶体使32768HZ/8MHZ.
MSP430F149串口行实验程序
//使用ADC12采集实验,将采集到数据送向PC.(序列单次采集,采用定时器A作为时钟源)
//P3.4为发送,P3.5为接收 晶体使32768HZ/8MHZ.
资 源 简 介
MSP430F149串口行实验程序
//使用ADC12采集实验,将采集到数据送向PC.(序列单次采集,采用定时器A作为时钟源)
//P3.4为发送,P3.5为接收 晶体使32768HZ/8MHZ. 串行波特率B/S
//使用SMCLK作为波特率发器时,不能使用LPM2,LPM3!
VIP 专区(每个包含40-100个资源包)
您 可 能 感 兴 趣 的
相 关 代 码
相 关 资 源
该 用 户 还 上 传
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员
月度VIP会员豆丁微信公众号
君,已阅读到文档的结尾了呢~~
MSP430串口编程和调试技巧串口,编程,调试,串口调试,编程技巧
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
MSP430串口编程和调试技巧
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口后使用快捷导航没有帐号?
请完成以下验证码
查看: 3313|回复: 3
MSP430 串口UART通信 通过串口调式助手接收字符串乱码,接收单个字符正常
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
本帖最后由 topszk 于
12:26 编辑
用MSP430F149&&写了个简单的串口通信,过程很简单,接收到电脑上的串口调试助手发来的数据之后,再通过串口给电脑回复一个固定的数据(一个字节)。发送采用查询的方式,接收采用中断的方式,全部代码如下:
#include &msp430x14x.h&
/////////串口发送函数,一次发送一个字节///////
void send_byte(unsigned char ubyte){
&&while(!(IFG1&UTXIFG0));
&&TXBUF0=
}
//////////////////////////////////////////////
void main(){
&&WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
&&
&&/////////////////////时钟初始化///////////////////////
&&BCSCTL1 &= ~ XT2OFF;
&&do{
& & IFG1 &= ~OFIFG;
& & for(unsigned char i=0xFF;i&0;i--);
&&}while(IFG1&OFIFG);
&&BCSCTL2|=SELS+SELM1;
&&//////////////////////////////////////////////////////
&&
&&////串口初始化 9600 N 8 1 ACLK 发送采用查询方式,接收采用中断方式//////
&&UCTL0 |= SWRST;
&&P3SEL=0x30;
&&ME1|=UTXE0+URXE0;
&&UCTL0|=CHAR;
&&UTCTL0|=SSEL0;
&&UBR00=0x03;
&&UBR10=0x00;
&&UMCTL0=0x4A;
&&UCTL0 &= ~SWRST;
&&IE1|=URXIE0;
&&///////////////////////////////////////////////////////////////////////
&&
&&while(1){
& & _BIS_SR(LPM3_bits+GIE);
&&}
&&
}
#pragma vector=USART0RX_VECTOR
__interrupt void uart_rx(void){
&&send_byte('A');
}
现在遇到的问题是:用串口调试助手,发送一个字符给单片机,可以正常运行,单片机进入中断处理程序,给上位机回复了一个固定的字符 'A',并通过串口调试助手的界面显示出来。但如果用助手发送一个字符串给单片机,那么单片机的工作将不正常了,请老师看截图:
1.gif (35.98 KB, 下载次数: 0)
12:25 上传
2.gif (36.25 KB, 下载次数: 0)
12:25 上传
3.gif (35.69 KB, 下载次数: 0)
12:25 上传
在线时间2660 小时
威望6090分
芯币6598枚
TA的帖子TA的资源
五彩晶圆(高级), 积分 6090, 距离下一级还需 3910 积分
五彩晶圆(高级), 积分 6090, 距离下一级还需 3910 积分
你试试这个思路,430开个缓冲区,收到一定长度字符串再一次性返回试试
在线时间255 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
串口的接收发送需要时间的,我用串口传输数据来代替仿真器的时候,发现不能让串口传送数据太快,否则会不准,
所以你试试楼上的方法,先接收完,再返回。
然后检查一下你的波特率 的配置,尤其是调整位
在线时间865 小时
威望13159分
芯币28979枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13159, 距离下一级还需 6841 积分
裸片初长成(初级), 积分 13159, 距离下一级还需 6841 积分
读一下接受缓冲或者将接受中断手动清零一下。
《MCU工程师炼成记》作者之一
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWORLD 官方微信
Powered by}

我要回帖

更多关于 串口发送接收数据详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信