MSP430 串口UART通信 通过串口调式助手接收字符串乱码,接收单个字符正常

MSP430 串口UART通信 通过串口调式助手接收字符串乱码,接收单个字符正常,第1张

当你发送一串字符串给单片机的时候,430刚接收到第一个字符于是开始进行回发固定数据串口助手,可还没发送完毕(发送需要时间,而你尽然在接收中断里发送,这样接受中断就得不到及时响应),你第二个字符串又进来了,于是出错了。(第一件事还没干完,你第二件、第三件。。。全部紧接的来了,要你,你不疯?)这里的问题是你没搞明白整个流程,这个程序框架也不好。这种情况下,你需要建立一个缓存区(FIFO),中断的任务就是把接收到的数据扔到缓存,置标志位,并立马退出!在主程序里发送数据,这样就不会导致接收无法及时响应问题(这个跟蓄水池一样的道理)

//创建一个串口通讯

SerialPort CurrentPort = null

CurrentPort = new SerialPort()

CurrentPort.ReadBufferSize = 128

CurrentPort.PortName = comName //端口号

CurrentPort.BaudRate = bandRate//比特率

CurrentPort.Parity =parity//奇偶校验

CurrentPort.StopBits = stop//停止位

CurrentPort.DataBits = databit//数据位

CurrentPort.ReadTimeout = 1000//读超时,即在1000内未读到数据就引起超时异常

//绑定数据接收事件,因为发送是被动的,所以你无法主动去获取别人发送的代码,只能通过这个事件来处理

CurrentPort.DataReceived += Sp_DataReceived

CurrentPort.Open()

定义一个变量 byte[] receiveStr

//绑定的事件处理函数

private static void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{

SerialPort sp = sender as SerialPort

if (sp == null)

return

byte[] readBuffer = new byte[sp.ReadBufferSize]

sp.Read(readBuffer, 0, readBuffer.Length)

//赋值

receiveStr=readBuffer//当然你可以通过转换将byte[]转换为字符串。

}

//你要求的按钮事件可以这么写

private void button1_Click(object sender, EventArgs e)

{

if(receiveStr!=null)

{

变量 xxx=receiveStr

}

}

不用中断 也行

#include <msp430x14x.h>

#define uint unsigned int

#define uchar unsigned char

void int_clk()

{

uchar i

BCSCTL1&=~XT2OFF //打开XT振荡器

BCSCTL2|=SELM1+SELS//MCLK 8M and SMCLK 1M

do

{

IFG1 &= ~OFIFG//清除振荡错误标志

for(i = 0i <100i++)

_NOP() //延时等待

}

while ((IFG1 &OFIFG) != 0) //如果标志为1继续循环等待

IFG1&=~OFIFG

}

int_usart()

{

U0CTL|=SWRST//复位串口

U0CTL|=CHAR//8位数据

U0TCTL|=SSEL1//select SMCLK AS CLK

U0BR0=0Xa0

U0BR1=0X01

UMCTL0=0Xc0//19200

ME1|=UTXE0+URXE0//使能接收和发送

U0CTL&=~SWRST//清除串口复位信号

IE1|=URXIE0//使能接收中断

P3SEL|=BIT4

P3SEL|=BIT5//选择I/O口使用扩展功能和方向

P3DIR|=BIT4

}

sent_byte(uchar data)

{

while((IFG1&UTXIFG0)==0)//判断发送缓冲区是否结束

U0TXBUF=data

}

#pragma vector=UART0RX_VECTOR

__interrupt void UART0_RX_ISR(void)

{

uchar data=0

data=U0RXBUF//读取接受到的数据并且发送到PC机

sent_byte( data)

}

int main( void )

{

WDTCTL=WDTPW+WDTHOLD//关闭看门狗

int_clk() //系统时钟初始化

int_usart()//初始化串口

_EINT() //使能中断

while(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12069906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存