【发布时间】:2014-03-21 16:46:16
【问题描述】:
我正在尝试将 MSP-EXP430F5529LP 外部串行端口(P3.4 和 P3.5)连接到外部串行设备。在 Energia 环境下,两者都设置为 9600,8 位,无奇偶校验,1 个停止位。我已经在上面的配置文件中设置了 Serial1 默认值。我正在运行以下草图
void setup()
{
// put your setup code here, to run once:
Serial1.begin(9600);
Serial.begin(9600);
}
void loop()
{
// put your main code here, to run repeatedly:
Serial1.write(48);
Serial.println(48,HEX);
delay(1000); //1 a second
}
TI 每秒传输一个字节,ASCII '0' 0x30 0b00110000 接收器正在接收一个字节,但它是 0x06 0b00000110 - 我已经尝试了所有常见的奇偶校验位和停止位,但我无法传输“0”成功地。我认为 Energia 对 MSP-EXP430F5529LP Serial 的支持可能存在一些错误,因为它几乎可以正常工作了。是否发生了一些奇怪的字节交换事情?我已经验证接收器的设置确实是9600N81。我应该去哪里看?
-编辑-
*(&(UCAxCTL1) + uartOffset) = UCSWRST;
*(&(UCAxCTL1) + uartOffset) = UCSSEL_2; // SMCLK
*(&(UCAxCTL0) + uartOffset) = 0;
*(&(UCAxABCTL) + uartOffset) = 0;
以上代码在 HardwareSerial.cpp 中并设置了所有默认值: 无奇偶校验、奇校验(由于之前的原因而忽略)、LSB 优先、8 位、一站式、UART 模式、异步。(参考 slau1.pdf 第 440 页)。使用上面的草图,我有以下传输字符和接收到的映射。我现在很困惑(我讨厌串行通讯!!)
Output from MSP430 Received
0000 0001 0111 1111
0000 0010 0011 1111
0000 0011 0111 1110
0000 0100 0001 1111
0000 0101 0111 1101
...
0000 1000 0000 1111
...
0001 0000 0000 0111
....
0010 0000 0000 0011
-EDIT 2- [已解决] 至少足以满足我的需求
我现在必须使用“软糖”修复。因为我只需要 MSP430 的输出,所以我修改了 HardwareSerial.cpp
size_t HardwareSerial::write(uint8_t c)
{
unsigned int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;
// If the output buffer is full, there's nothing for it other than to
// wait for the interrupt handler to empty it a bit
// ???: return 0 here instead?
while (i == _tx_buffer->tail);
//Fix wierdness
///////////////////////
_tx_buffer->buffer[_tx_buffer->head] = 255-(c*2); //Originally was 'c' this formula was calculated by JWH
///////////////////////
_tx_buffer->head = i;
#if defined(__MSP430_HAS_USCI_A0__) || defined(__MSP430_HAS_USCI_A1__) || defined(__MSP430_HAS_EUSCI_A0__) || defined(__MSP430_HAS_EUSCI_A1__)
*(&(UCAxIE) + uartOffset) |= UCTXIE;
#else
*(&(UC0IE) + uartOffset) |= UCA0TXIE;
#endif
return 1;
}
如果有人能解释为什么会发生这种情况,我很乐意投票给你!
【问题讨论】:
标签: serial-port uart msp430