No, I am reading data from a SpO2 module. The module sends out 5 bytes in sequence continuously. Among the bytes sent out from module, I only need to extract two of them which provide the information of the SpO2 and pulse rate. I used software UART to communicate with the SpO2 module while hardware UART to communicate with PC UART. When I connect the SpO2 directly to the PC, the data is correct. However, when I connect the SpO2 module and PC through PIC16F877, the data all mess up. I think it's probably because of the insufficient buffer in the PIC. I never handle such problem and I failed to solve the problem after trying for the whole day. What can I do to solve this problem?
Here is the PIC code written in PICBasic Pro:
Code:INCLUDE "modedefs.bas" DEFINE LOADER_USED 1 DEFINE OSC 20 B0 VAR BYTE B1 VAR BYTE B2 VAR BYTE B3 VAR BYTE B4 VAR BYTE B5 VAR BYTE B6 VAR BYTE B7 VAR BYTE B8 VAR BYTE PR VAR BYTE SPO2 VAR BYTE ID_2 VAR BYTE ID_1 VAR BYTE ID_0 VAR BYTE 'PB.7 = Rx TRISB = %10000000 'data acquisition ID ID_2 = "0" ID_1 = "1" ID_0 = "1" 'request from PC, 9600 baud rate standby: SerIn PORTC.7,6,["P",ID_2, ID_1, ID_0] loop: '4800 baud rate, SerIn2 PORTB.7,16572,[B0, B1, B2, B3, B4, B5, B6, B7, B8] ' detect synchorous bit (the header byte in 5 bytes data) IF B0 > 127 Then GoTo b0_true EndIF IF B1 > 127 Then GoTo b1_true EndIF IF B2 > 127 Then GoTo b2_true EndIF IF B3 > 127 Then GoTo b3_true EndIF IF B4 > 127 Then GoTo b4_true EndIF GoTo loop ' extract PR and SpO2 data b0_true: IF B2 > 63 Then B2=64 Else B2=0 EndIF B3=B3+B2 PR=B3 SPO2=B4 GoTo send_data b1_true: IF B3 > 63 Then B3=64 Else B3=0 EndIF B4=B4+B3 PR=B4 SPO2=B5 GoTo send_data b2_true: IF B4 > 63 Then B4=64 Else B4=0 EndIF B5=B5+B4 PR=B5 SPO2=B6 GoTo send_data b3_true: IF B5 > 63 Then B5=64 Else B5=0 EndIF B6=B6+B5 PR=B6 SPO2=B7 GoTo send_data b4_true: IF B6 > 63 Then B6=64 Else B6=0 EndIF B7=B7+B6 PR=B7 SPO2=B8 GoTo send_data 'send to PC, 9600 baud rate send_data: SerOut PORTC.6,6,[ID_2, ID_1, ID_0, "^P^", #PR, "^", #SPO2] GoTo standby End




Bookmarks