Mình có 3 slave để truyền thông.
- Vấn đề của mình như sau : trên máy tính sẽ gửi xuống 3 byte : địa chỉ slave +địa chỉ thiết bị + mã xác nhận (kí tự 'a').
- khi mình test từ máy tính truyền xuống thì nếu như thỏa mãn điều kiện đúng byte xác nhận và đúng slave thì nó sẽ cho con led on con led 7 đoạn led để mình biết các slave có nhận đúng không . và mình test thì thấy rất ok. Vậy là phần cứng của mình chắc không có gì sai.
và đây là code test :
[CODE]while (1)
{
if(rx_counter >= 3)
{unsigned char temp_receive[3];
temp_receive[0]= getchar();// dia chi slave
temp_receive[1]= getchar();// dia chi device
temp_receive[2]= getchar();// ma xac nhan
if(('a'== temp_receive[2])&&(temp_receive[0]== slave)) // kiểm tra mã xác nhận và slave
{
device = temp_receive[1]; // nếu đúng thì gán dữ liệu device vào biến toàn cục device để cho on con led 7 đoạn này led trong ngắt timer.
}
}
}
}[/CODE]
- Vấn đề sai phát sinh như sau mà có lẽ mình nghĩ chắc chắn là do code :khi mình gửi từ cp xuống vẫn với frame truyền như ví dụ trên và yêu cầu nếu đúng slave nào thì nó phải gửi lại máy tính một frame gồm 8 byte :
ví dụ trên cp mình sẽ yêu cầu slave 3 gủi về data của thiết bị 3 ( device =3).kết quả là gửi bình thường . Nhưng khi mình không chọn slave 3 nữa mà chọn slave khác 2 hay 1 chẳng hạn và yêu cầu nó gửi về thì nó không gửi.---> lúc này mình chỉ có thể yêu cầu slave 3 gửi về mà thôi. nếu muốn slave khác gửi về thì mình phải nhấn reset cái slave đó và gửi lại yêu cầu từ máy tính xuống. Nhưng vẫn chỉ được 1 slave thôi.
=> vậy là nếu slave nào mà mình gửi yêu cầu trên máy tính xuống trước thì nó hoạt động còn slave khác thì không.
=> Mình nghĩ sai có lẽ là khi mà slave nào đó được chọn và gửi data về cp thì các slave khác cũng nhận (nhận tới 8 byte). và khi đó nó cũng đọc và xử lý nhưng không hết bộ đệm nên khi cp yêu cầu những slave này gủi thì nó không nhận đúng thứ tự byte trong bộ đệm nhận nữa. tuy nhiên mình cũng đã khắc phục lỗi này bằng cách :
nhưng mình vẫn không khấc phục được lỗi trên. xin được chỉ giáo thêm.
đây là code mà mình miêu tả có lỗi ở trên.
- Vấn đề của mình như sau : trên máy tính sẽ gửi xuống 3 byte : địa chỉ slave +địa chỉ thiết bị + mã xác nhận (kí tự 'a').
- khi mình test từ máy tính truyền xuống thì nếu như thỏa mãn điều kiện đúng byte xác nhận và đúng slave thì nó sẽ cho con led on con led 7 đoạn led để mình biết các slave có nhận đúng không . và mình test thì thấy rất ok. Vậy là phần cứng của mình chắc không có gì sai.
và đây là code test :
[CODE]while (1)
{
if(rx_counter >= 3)
{unsigned char temp_receive[3];
temp_receive[0]= getchar();// dia chi slave
temp_receive[1]= getchar();// dia chi device
temp_receive[2]= getchar();// ma xac nhan
if(('a'== temp_receive[2])&&(temp_receive[0]== slave)) // kiểm tra mã xác nhận và slave
{
device = temp_receive[1]; // nếu đúng thì gán dữ liệu device vào biến toàn cục device để cho on con led 7 đoạn này led trong ngắt timer.
}
}
}
}[/CODE]
- Vấn đề sai phát sinh như sau mà có lẽ mình nghĩ chắc chắn là do code :khi mình gửi từ cp xuống vẫn với frame truyền như ví dụ trên và yêu cầu nếu đúng slave nào thì nó phải gửi lại máy tính một frame gồm 8 byte :
ví dụ trên cp mình sẽ yêu cầu slave 3 gủi về data của thiết bị 3 ( device =3).kết quả là gửi bình thường . Nhưng khi mình không chọn slave 3 nữa mà chọn slave khác 2 hay 1 chẳng hạn và yêu cầu nó gửi về thì nó không gửi.---> lúc này mình chỉ có thể yêu cầu slave 3 gửi về mà thôi. nếu muốn slave khác gửi về thì mình phải nhấn reset cái slave đó và gửi lại yêu cầu từ máy tính xuống. Nhưng vẫn chỉ được 1 slave thôi.
=> vậy là nếu slave nào mà mình gửi yêu cầu trên máy tính xuống trước thì nó hoạt động còn slave khác thì không.
=> Mình nghĩ sai có lẽ là khi mà slave nào đó được chọn và gửi data về cp thì các slave khác cũng nhận (nhận tới 8 byte). và khi đó nó cũng đọc và xử lý nhưng không hết bộ đệm nên khi cp yêu cầu những slave này gủi thì nó không nhận đúng thứ tự byte trong bộ đệm nhận nữa. tuy nhiên mình cũng đã khắc phục lỗi này bằng cách :
Code:
// sau khi đọc từ bộ đệm nhận thì phải xóa cái biến đếm nhận đi rx_counter = 0;
đây là code mà mình miêu tả có lỗi ở trên.
Code:
while (1) { if(rx_counter >= 3) {unsigned char temp_receive[3]; temp_receive[0]= getchar();// dia chi slave temp_receive[1]= getchar();// dia chi device temp_receive[2]= getchar();// ma xac nhan if(('a'== temp_receive[2])&&(temp_receive[0]== slave)) //ma xac nhan dung thi gui lai du lieu ve may tinh */ { putchar(slave); // dia chi slave ( byte 1) putchar(device);// dia chi device ( byte 2) device = temp_receive[1]; // gan dia chi thiet bi putchar(2222%256);// du lieu byte thap (byte 3) putchar(2222/256);// gui byte cao (byte 4) putchar(3333%256);// gui thap (byte 5) putchar(3333/256);// gui byte cao (byte 6) putchar(100); // (byte 7) putchar('a'); // ma xac nhan (byte 8) } } } }
Comment