I'm having a problem with a pointer to struct. I'm working with the PC16552 UART, (it has 2 UARTs), and I created a struct for each UART like this:
typedef struct _uart { uchar xdata *ucBuffer; uchar xdata *ucLineCt; uchar xdata *ucLineSt; } uart;
void int0(void) interrupt 0 { ... getByte(&Serial1); ... } void int1(void) interrupt 1 { ... getByte(&Serial2); ... } void getByte(uart *actualSerial) reentrant { unsigned char ucByte; ucByte = *actualSerial->ucBuffer; ... }
if(actualSerial == &Serial2) { if(i < 20) Dump[i++] = ucByte; }
I'm quite sure this has nothing to do with your Subject: line. If the problem was caused by pointer manipulation, you'ld be hit every time. It wouldn't work most of the time, but fail for particular values, and then only by flipping some bits. This feels much more like a hardware problem, to me. Flaky signal lines, incorrect timing, you name it.
I've made the following substitution:
void getByte(uart *serialAtual) reentrant { uchar ucByte; uchar ucCrc; uchar ucAux; ucByte = *serialAtual->ucBuffer; ucAux = ucByte; ... }
Sorry, but that "substition" is far from clear. The only actual change visible, compared to the original source fragment, is that ucByte is now "uchar" instead of "unsigned char", and that you now have new variables --- but those might as well have been silently omitted in the original posted fragment. And uchar is just an alias for unsigned char you defined for your own use, I'm sure. So, what did you actually change? An error pattern that is affected by the choice of data bytes, as you described it, points rather strongly at the hardware as the culprit. Software hardly ever cares about the actual bits it moves around.
View all questions in Keil forum