我正在尝试编译一个简单的片段代码,但我遇到了一个错误“无法为此表达式生成代码”。 我改编自“http://www.barrysoft.it/blog/midi-with-pic-ausart.html”
的代码有人可以告诉我这个问题吗?
MPLAB X IDE v2.15 xc8 v1.32
midi.c:
void midi_init(void)
{
/* MIDI uses 31250 baud/s serial speed */
uart_init(19, 1, 0, 0 ); //<---
}
midi.c:31:error:(712)无法为此表达式生成代码
uart.c:
void uart_init(unsigned char spbrg, unsigned bit brgh, unsigned bit sync, unsigned bit parity)
{
// Setup the baud rate
SPBRG = spbrg;
// High speed baud rate
BRGH = brgh; ////
// Synch or Async
SYNC = sync; ////
// 8bit transmission
TX9 = parity; ////
// Enable serial output
SPEN = 1;
// Enable UART out
TXEN = 1;
}
uart.c:29:错误:(712)无法为此表达式生成代码
uart.c:32:错误:(712)无法为此表达式生成代码
uart.c:35:错误:(712)无法为此表达式生成代码
uart.h:
void uart_init(unsigned char spbrg, unsigned bit brgh,unsigned bit sync,unsigned bit parity);
无法解析标识符位,此接缝是MPLAB IDE错误,可以关闭。
答案 0 :(得分:2)
这可能是编译器如何处理低于处理器原生宽度的数据的问题。
一个简单的解决方法是使用宏而不是函数。这是有效的,因为你让编译器处理它认为合适的类型转换和文字数据,而不是强制它将位变量提交到内存位置(对于函数调用)。
在uart.h中:
#define uart_init( spbrg, brgh, sync, parity ) \
SPBRG = spbrg;\
BRGH = brgh;\
SYNC = sync;\
TX9 = parity;\
SPEN = 1;\
TXEN = 1
*请注意,我故意遗漏了最后一行&#39;;&#39;这样可以像函数一样调用宏。
在midi.c:没有变化......
uart_init(19, 1, 0, 0 );