MSP430F169 A板怎么通过串口发送指令给B板

问题:现在这个是A板的代码,a板怎么发送控制指令给B板控制B板LED灯闪烁颗数,然后B板接收A板的指令后,按照指令控制其LED灯闪烁同时回馈一个指令给A板
*/
//———————————————————————————
#include<msp430F169.h>
#include"Config.h"
//————————————定义全局变量——————————
int num = 0;
int i=0;
uint flag=0;
uchar dara=0;
uchar temp[10];
uchar cnt=0; //记录所使用的数组单元
unsigned int keyFlag = 0;
unsigned int antiShakeCnt = 0;
char startFlg = 0;
char ledStyle = 0x00;
char pushInitFlag = 0;
uchar cntRx = 0;
uchar cntTx = 0;
uchar dataLen=0;
uchar dataBuff[255];
uchar *data;
uchar tmp;

/*
*key1控制闪烁速度
*key0控制闪烁数量
*key2开启闪烁————首先需要判断key2按键是否被按下
/
char pushFlag=0;
/

*闪烁速度设置为三挡:
*分别是:300ms、800ms、2s
*speed=300/800/2000
*通过判断key1被按下的次数来确定
*为了判断key1被按下的次数,需要用一个变量来记录次数
*/
unsigned int key1Cnt=0; //记录key1被按下的次数
unsigned int key0Cnt=0; //记录key0被按下的次数
unsigned int speed=100; //初始化闪烁速度为100ms
//————————————模块初始化———————————
//时钟配置初始化
void cIkInit()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门口狗
BCSCTL1 = 0x00; //0x00等价于:BCSCTL1=BCSTL1&0x7F;
do //打开需要用到的晶振模块,此处选用XT2模块
{
IFG1 &= 0xfd; //将OFIFG标志位清零
for(int i = 0; i< 0xff; i++); //等待至少50us
}while((IFG1 & 0x02) != 0); //判断OFIFG标志是否被重新置位为1
BCSCTL2 = 0x8e;
}
///端口配置初始化
void portInit()
{
P6DIR = 0xff; //对P6组I/O口进行初始化
P6OUT = 0xff; //初始化后,P6组I/O口输出高电平
P5SEL = 0x20;
P3DIR = 0x01;
P3OUT = 0x00; //P3组I/O口输出低电平
P1DIR = 0x00; //P1组I/O口输入低电平
}
//定时器A配置初始化
void timerAinit()
{
TACTL = 0x0212; //定时器时钟源选择为SMCLK,不分频、增计数模式、开中断
TACCR0 = 1000 - 1; //指定定时器时长(计数目标值)
}
//串口配置初始化
void uartInit()
{
U0CTL|=SWRST; //复位SWRST
U0CTL|=CHAR; //8位数据模式
U0TCTL|=SSEL1; //SMCLK为串口时钟
U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l; //N=UBR+(UxMCTL)/8
U0MCTL=0x00; //微调寄存器为0,波特率9600bps
ME1|=UTXE0; //UART0发送使能
ME1|=URXE0; //UART0接收使能
U0CTL&=~SWRST;
IE1|=URXIE0; //接收中断使能位
IE1|=UTXIE0;
P3SEL|= BIT4; //设置IO口为普通I/O模式
P3DIR|= BIT4; //设置IO口方向为输出
P3SEL|= BIT5;
}
//————————————模块初始化结束—————————
//————————
//————————————功能函数初始化—————————
//串口O发送数据函数
void shiftLed(uint cT)
{
ledStyle = 0xff;
ledStyle = ledStyle << cT;
P6OUT = P6OUT & ledStyle;
}

void configSet()
{
if(dataBuff[1] == 0x01)
startFlg = 1;
else
startFlg = 0;
switch(dataBuff[2]){
case 0x01:
speed = 300;
break;
case 0x02:
speed = 800;
break;
case 0x03:
speed = 2000;
break;
default:
speed = 100;
break;
}
switch(dataBuff[3]){
case 0x01:
shiftLed(1);
break;
case 0x02:
shiftLed(2);
break;
case 0x03:
shiftLed(3);
break;
case 0x04:
shiftLed(4);
break;
case 0x05:
shiftLed(5);
break;
case 0x06:
shiftLed(6);
break;
case 0x07:
shiftLed(7);
break;
case 0x08:
shiftLed(8);
break;
default:
shiftLed(0);
break;
}
}

/void Send_Byte(uchar data)
{
while((IFG1&UTXIFG0)==0); //发送寄存器空的时候发送数据
U0TXBUF='A';
//U0TXBUF=30;
}
/
//按键控制
void keyScan() //按键扫描函数
{
//因为需要用到三个按键,并且这三个按键都是分立的,不是按键矩阵
//所以需要分开判断,统一使用一个按键按下标志位,通过标志位不同的赋值来确定不同的按键
//显然需要用到switch语句:
switch((P1IN & 0x07)){
case 0x06: //0x06 = 0000 0110 对一个KEY0被按下
pushInitFlag = 1; //按键被按下
break;
case 0x05: //0x05 = 0000 0101 对一个KEY1被按下
pushInitFlag = 1;
break;
case 0x03: //0x03 = 0000 0011 对一个KEY2被按下
pushInitFlag = 1;
break;
default:
pushInitFlag = 0; //将按键置零
break;
}
if(pushInitFlag == 1) //判断按键是否被按下
{
pushInitFlag = 0;
antiShakeCnt++;
if(antiShakeCnt == 20) //防抖
{
antiShakeCnt = 0;
switch((P1IN & 0x07)){ //选择P1端口与0x07按位取与
case 0x06: //0x06 = 0000 0110 对一个KEY0被按下
pushFlag = 1;
break;
case 0x05: //0x05 = 0000 0101 对一个KEY1被按下
pushFlag = 2;
break;
case 0x03: //0x03 = 0000 0011 对一个KEY2被按下
pushFlag = 3;
break;
default:
break;
}
}
}
if(pushFlag == 1 || pushFlag == 2 || pushFlag == 3) //按键选择
{
if((P1IN | 0xf8) == 0xff)
{
if(pushFlag == 3)
{
pushFlag = 0;
startFlg = 1; //KEY2被按下,开启闪烁,否则不闪
}
if(pushFlag == 2)
{
pushFlag = 0;
key1Cnt++;
switch(key1Cnt){ //选择按键key1==s2
case 1: //s2按第一次
speed = 300; //速度设置为300ms
break;
case 2: //s2按第二次
speed = 800; //速度设置为800ms
break;
case 3: //s2按第三次
speed = 2000; //速度设置为2000ms
break;
case 4: //s2按第四次
speed = 100; //速度设置为100ms
key1Cnt = 0; //将按键s2置零
break;
default:
break;
}
}
if(pushFlag == 1) //判断按键是否按下
{
if(key0Cnt == 0)
ledStyle = 0xff; //led初始为高电平
pushFlag = 0;
key0Cnt++;
if(key0Cnt<=8)
{
ledStyle = ledStyle << 1; //led灯左移一位
P6OUT = P6OUT & ledStyle; //P6与led的值做按位取与后将值赋予P6
}
else
{
key0Cnt = 0;
}
}
}
}
}
//————————————中断函数————————————
//--------------------处理来自串口O的接收中断
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
dataBuff[cntRx++]=U0RXBUF;
if(dataBuff[cntRx - 1] == 0xfd){
dataLen = cntRx;
cntRx = 0;
if(dataBuff[0] == 0xfe){
configSet();
data = dataBuff;
IFG1 |= UTXIFG0;
}
}
}
/*{
temp[cnt]=U0TXBUF; //接收到的数据存起来
cnt++;
if(cnt==3)
{
i=0;
cnt=3;
IFG1|=UTXIFG0;
}
}
/uchar data=0;
data=U0RXBUF; //接收到的数据存起来
IE1|=UTXIE0;
//Send_Byte(data); */ //将接收到的数据再发送出去

//-----------------------处理来自串口O的发送中断、预备
#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
{
if(cntTx < dataLen)
{
U0TXBUF = *(data+cntTx);
cntTx++;
}
else
{
cntTx=0;
}
}

/{ /不能在中断中使用while,会有冲突,利用不断给buff赋值进行中断的方式
实现while的作用/
if(i<3)
{
U0TXBUF=temp[i];
i++;
}
else
i=0;
}
/U0TXBUF='F';
IFG1|=UTXIFG0;
/
//---------------------------------定时器A中断
#pragma vector = TIMERA1_VECTOR //调用的是TAIFG中断标志位、TIMERA0_BECTOR对应的是TACCR0 CCIFG标志位
__interrupt void flick(void)
{
switch(TAIV)
{
case 10: //比较
keyScan();
if(num < speed) //选择num<100的进行下一语句
num++; //当num<speed(100)进行++
else
{
num = 0;
if(startFlg == 1)
{
P6OUT = ~P6OUT|ledStyle; //使灯常亮或不亮,不会乱变
}
}
break;
default:
break;
}
}
//-------------------------主函数
main(void)
{
cIkInit() ; //调用时钟初始化
portInit(); //调用端口初始化
timerAinit(); //调用定时器初始化
_EINT(); //使能全局中断
while(1); //循环语句
}

a板你通过串口去发送你自己定义的内容给b板就好了
比如 我a板发送 1 给b板,b板通过串口接收到后判断接收到的是否是 1 ,是就亮灯并通过串口发送一个应答给a板,比如发送 2
这里的1 2 就是协议,自己定义就可以,喜欢用aa bb也行

你这个属于串口通信没理解清楚 多去看几个例程就行了