在用MSP430串口通信的时候可以使用串口助手与430进行通信,但是与openmv通信时只能做到,430发送数据给openmv后,openmv接收数据,但是接收的数据会变成十六进制,有看过相关文章进行修改但无大用。准备先用openmv向430发送数据,毕竟这才是大头,这边可以通过openmv IDE的串行终端检测到有发送数据,但是430接收不到数据 ,不知道是接收代码的中断有问题还是其他原因,请大佬们指导一下
以下是我通过相关文章自己写的一个代码:大致是开了430的两个串口,当openmv识别到红色物体时发送数据a且430的串口0接收到后会将LED1亮,openmv没有识别到红色物体时发送数据b且430的串口0接收到后会将LED1灭
开发环境为CCS,OPENMV的P4引脚(TX)接430的P3.4(RX),OPENMV的P5引脚(RX)接430的P3.3(TX)
OPENMV代码:
import sensor, image, time
from pyb import UART
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
# 初始化UART
uart = UART(3, 9600)
while True:
img = sensor.snapshot()
blobs = img.find_blobs([(30, 100, 15, 127, 15, 127)], pixels_threshold=200, area_threshold=200)
if blobs:
uart.write('a') # 发送'a'给MSP430
print('a')
else:
uart.write('b') # 发送'b'给MSP430
print('b')
MSP430代码:
#include <msp430.h>
void initUART(void) {
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
P3SEL |= BIT4 + BIT3; // P4.4 = USCI_A1 TXD, P4.5 = USCI_A1 RXD
UCA0CTL1 |= UCSWRST; // 进入软件复位状态
UCA0CTL1 |= UCSSEL_2; // 选择 SMCLK 作为时钟源
UCA0BR0 = 6; // 波特率设置为9600,时钟频率 = 1MHz
UCA0BR1 = 0;
UCA0MCTL |= UCBRS_0 + UCBRF_13 + UCOS16; // 调制设置
UCA0CTL1 &= ~UCSWRST; // 退出软件复位状态
UCA0IE |= UCRXIE; // 使能接收中断
P4SEL |= BIT4 + BIT5; // P4.4 = USCI_A1 TXD, P4.5 = USCI_A1 RXD
UCA1CTL1 |= UCSWRST; // 进入软件复位状态
UCA1CTL1 |= UCSSEL_2; // 选择 SMCLK 作为时钟源
UCA1BR0 = 6; // 波特率设置为9600,时钟频率 = 1MHz
UCA1BR1 = 0;
UCA1MCTL |= UCBRS_0 + UCBRF_13 + UCOS16; // 调制设置
UCA1CTL1 &= ~UCSWRST; // 退出软件复位状态
UCA1IE |= UCRXIE; // 使能接收中断
}
void sendUART(char *data) {
while (*data != '\0') { // 发送直到遇到字符串结束符 '\0'
while (!(UCA1IFG & UCTXIFG)); // 等待发送缓冲区空闲
UCA1TXBUF = *data++; // 发送数据
}
}
int main(void) {
P1DIR |= BIT0; // 设置 P1.0 为输出(LED 控制)
initUART();
__enable_interrupt(); // 使能全局中断
__bis_SR_register(LPM0_bits); // 进入低功耗模式0,等待中断唤醒
return 0;
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void) {
switch(__even_in_range(UCA0IV, 4)) {
case 0: break; // 无中断
case 2: // 接收中断
if (UCA0RXBUF == 'a') {
P1OUT |= BIT0; // 如果接收到 'a',则点亮 P1.0(LED1)
} else if (UCA0RXBUF == 'b') {
P1OUT &= ~BIT0; // 如果接收到 'b',则关闭 P1.0(LED1)
}
break;
case 4: break; // 发送中断
default: break;
}
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void) {
switch(__even_in_range(UCA1IV, 4)) {
case 0: break; // 无中断
case 2: // 接收中断
sendUART("Received: ");
sendUART((char *)&UCA1RXBUF); // 发送接收到的数据给串口助手
sendUART("\r\n");
break;
case 4: break; // 发送中断
default: break;
}
}