nối tiếp driver cho 8.051

M

Mithila

Guest
Chào,
Tôi đang phát triển trình điều khiển nối tiếp cho 8.051.
Tôi đã compltd đoạn code để gửi các chuỗi như là
SendStr (char * Str)
(
trong khi (* P. = '! \ 0')
(
TI0 = 0;
SBUF0 = (* Str);
trong khi (TI0);
TI0 = 0;
Str ;
)
)

và tôi viết cho tôi cũng đã nhận được bằng cách sử dụng gián đoạn.
Nhưng bây giờ tôi đã thay đổi phương pháp này là chức năng tiếp nhận Recvstr (char * ptr, int maxlength).Bất cứ ai có thể giúp đỡ?
Những thói quen ISR là
void serialdriver (void) interrupt 4 sử dụng 1
(
nếu (RI0)
(
ch [j ] = SBUF0;
RI0 = 0;
if (ch [j-1] == 0x0d) / / 0x0d - hex giá trị cho dòng mới
(
string = 1;
ch [j] = '\ 0';
)
)

)

 
Trong đó trình biên dịch mà bạn đang sử dụng?

 
Tôi nghĩ rằng các chức năng giao tiếp nối tiếp / thói quen nên có sẵn trong Keil thư viện.Có lẽ tôi đã sai lầm trước đây.Cảm ơn.

 
Chào

SendStr (char * Str)
(
trong khi (* P. = '! \ 0')
(
TI0 = 0;
SBUF0 = (* Str);
trong khi (TI0);
/ / TI0 = 0; / / Đó là không cần thiết
Str ;
)
)

và tôi viết cho tôi cũng đã nhận được bằng cách sử dụng gián đoạn.
Nhưng bây giờ tôi đã thay đổi phương pháp này là chức năng tiếp nhận Recvstr (char * ptr, int maxlength).Bất cứ ai có thể giúp đỡ?

int Recvstr (char * ptr, int maxlength) / / -1 nếu trở lại chức năng của TP len> max
(
int strlen = 0;

trong khi (1) / / vòng lặp vô tận
(
trong khi (RIO == 0); / / biểu tượng chờ đợi

RI0 = 0;
nếu (SBUF0 = 0x0d!) & & (SBUF0 = 0x0a!)
ptr [strlen ] = SBUF0;
nếu strlen> maxlength
(
ptr [strlen] = 0;
return -1;
)
khác
(
ptr [strlen] = 0;
string = 1;
return 0;
)
)
)

Trân trọng, Kuka

 
chào,
Làm thế nào để nhận chuỗi bằng cách sử dụng UART gián đoạn?Tôi đã sử dụng các chức năng cũng có, tương tự như gửi chuỗi.Bạn đã đăng các chức năng gửi chuỗi.
Xin vui lòng giúp đỡ.
Mithila

 
chào
Đây là thư viện RS232 của tôi với ngắt hướng.Sis
Xin lỗi, nhưng bạn cần phải đăng nhập để xem tập tin đính kèm này

 
Chào,
Thks rất nhiều.
Kể từ khi tôi mới đến 8.051 lập trình, Cant thể hiểu mã ur.
Pls u có thể giúp đỡ trong việc sửa đổi mã số của tôi mà không có lỗi?
Pls giúp tôi.
Mithila.Thêm vào sau khi 2 giờ 8 phút:chào,
pls giúp tôi để tìm ra lỗi trong các mã sau đây.
Tôi muốn được chiều dài tối đa là 10 cho nhận được chuỗi.Nhưng nó vượt quá.
Pls giúp tôi tìm ra lỗi.bit bFlag = 0;
char caString [15];
int index;
char * gBuf;
int GLength;

void main (void)
(
int iIndex;

initHW (); / / Phần cứng initialisation.

SetBaudRate (9600); / * TH1: tải lại giá trị cho 9.600 baud @ 25MHz * /

trong khi (1)
(
RecvStr (caString, 10); / / Nhận String
nếu (bFlag)
(
bFlag = 0;
SendStr (caString); / / Gửi String
for (iIndex = 0; iIndex <15; iIndex )
(
caString [iIndex] = 0;
)
index = 0;
)
)

)Bool initHW ()
(

EA = 0; / / Vô hiệu hoá toàn cầu ngắt

WDTCN = 0xde; / / Watchdog timer
WDTCN = 0xad;

XBR0 = 0x04 / / thanh ngang cấu hình
XBR1 = 0x14;
XBR2 = 0xC0;

P0 = 0x01;

SCON0 = 0x50; / * SCON0: chế độ 1, 8-bit UART, enable receiver * /
TMOD = 0x20; / * TMOD: timer 1, mode 2, 8-bit reload * /
TR1 = 1; / * TR1: timer 1 run * /
TRANSMIT_INTERRUPT = TI0 = 1;

ES0 = 1;
EA = 1; / / Cho phép ngắt toàn cầu
return 0;

)Bool SetBaudRate (int iBaudRate)
(
switch (iBaudRate)
(
2.400 trường hợp:
TH1 = (int) (TIMERVALUE2400>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Mát mẻ" border="0" />

/ / Giá trị được nạp dựa trên BR
break;
4.800 trường hợp:
TH1 = (int) (TIMERVALUE4800>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Mát mẻ" border="0" />

/ / Giá trị được nạp dựa trên BR
break;
19.200 trường hợp:
TH1 = (int) (TIMERVALUE19200>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Mát mẻ" border="0" />

/ / Giá trị được nạp dựa trên BR
break;
mặc định:
TH1 = (int) (TIMERVALUE9600>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Mát mẻ" border="0" />

/ / Giá trị được nạp dựa trên BR
)
return 0;
)

Bool SendStr (char * Str)
(
trong khi (* P. = '! \ 0')
(
TI0 = 0;
SBUF0 = (* Str); / / Gửi String để đệm
trong khi (TI0);
TI0 = 0;
Str ;
)
return 0;
)

Bool Recvstr (char * ptStr, int iMaxLength)
(
GLength = iMaxLength;
gBuf = ptStr;
index = 0;
trong khi (RI0 == 0);
return 0;
)

void serialdriver (void) interrupt 4 sử dụng 1
(
nếu (RI0)
(
RI0 = 0;
if ((SBUF0 = 0x0d!) & & (SBUF0 = 0x0a!))
(
gBuf [index ] = SBUF0;
if (index> GLength)
(
gBuf [index] = 0;
)
bFlag = 1;
)
)
)

 
, try to use tags "Code" to format your sources.

Mithila,
hãy thử sử dụng thẻ "Mã" để định dạng nguồn của bạn.Nếu không, nó là một cơn đau để đọc mã của bạn.

So sánh:

Mithila đã viết:trong khi (1)

(

RecvStr (caString, 10); / / Nhận String

nếu (bFlag)

(

bFlag = 0;

SendStr (caString); / / Gửi String

for (iIndex = 0; iIndex <15; iIndex )

(

caString [iIndex] = 0;

)

index = 0;

)

)

 
Chào,
Hãy thử các ví dụ cung cấp từ Keil, họ r rất hữu ích ...

 

Welcome to EDABoard.com

Sponsor

Back
Top