PDA

View Full Version : ??? pic nhận và gửi 1 gói data 4 byte lên máy tính


dung h
02-11-2009, 01:40 PM
em đang làm đồ án bị mắc phải vấn đề này ! các bác biết thì chỉ dùm em với
đó là em làm về điều khiển tốc độ động cơ từ pc xuống mạch vdk và phản hồi tốc độ(ecoder) lên computer nhưng vấn đề là rs232 chỉ truyền nhận 8 bit( giá trị max là 255)
mà giá trị tốc độ em truyền xuống từ vài chục -> vài nghìn và giá trị xung ecoder phản hồi cỡ hàng nghìn xung nên em phải đóng gói nó lại khoảng 4 byte cho 1 data
byte đầu là mã lệnh ,các byte tiếp theo là giá trị
vấn đề truyền nhận vài byte trên vb thì ok nhưng còn ở vdk pic thì em chưa giả quyết được
mong các bác giải quyết giúp em
-làm thế nào vdk nhận dc 1 gói 4 byte một (Sxxx : s là mã lệnh điều khiển tốc độ, xxx giá trị điều khiển . dxxx : đảo chiều động cơ)
-cách gủi 1 gói data 4byte lên pc (vd giá trị ecoder là 2000 chia làm 1 gói 4 byte gủi lên pc)

kiến thức còn hạn chế mong các bác chỉ giáo! em chân thành cảm ơn!

nhamdtk4
02-11-2009, 07:20 PM
Sao phải rắc rối hóa vấn đề lên như vậy. Một số bất kỳ có thể tách đc thành số ..."hàng nghìn", "hàng trăm", "hàng chục",... cơ mà và các số đó đương nhiên chỉ có 8 bit, truyền lần lượt lên cần j phải truyền một phát 4 byte.

chestnut
02-11-2009, 07:21 PM
Sài kiểu union để giải quyết

union LONG2CHAR
{
struct
{
char data1;
char data2;
char data1;
char data2;
};
long data;
};
Sau đó gửi dữ liệu data1,data2,data3,data4 lên. Trên master thì dùng union như vậy để bắt dữ liệu! Có gì thắc mắc liên lạc mình sẽ đưa cho bạn code C ví dụ.

dung h
03-11-2009, 01:08 AM
vấn đề của em ở đây là khi truyền từ máy tính xuống! vd mình liên tục đảo chiều và điều chỉnh tốc độ khi đó thì dữ liệu truyền liên tục xuống vdk mà giá trị thay đổi lớn >255 cỡ hàng nghìn vì thế ta chia data đó làm 4 byte vấn đề là làm thế nào phân biết byte nào là gói giá trị của lần điều tốc độ 1,2,3..hay tín hiệu đảo chiều???
mong giải đáp!thanks!

dung h
03-11-2009, 01:13 AM
Sao phải rắc rối hóa vấn đề lên như vậy. Một số bất kỳ có thể tách đc thành số ..."hàng nghìn", "hàng trăm", "hàng chục",... cơ mà và các số đó đương nhiên chỉ có 8 bit, truyền lần lượt lên cần j phải truyền một phát 4 byte.

truyền lên pc thì mình ok còn vấn đề là mình truyền từ pc xuống gồm nhiều lệnh điều khiển : nó có start,stop ,đảo chiều ,thay đổi vận tốc vì thế bắt buộc mình phải đóng gói data
byte đầu là byte mã lệnh( đảo chiều hay tốc độ) các byte tiep theo la byte giá trị thay đổi
mỗi gói khoảng 4 byte chẳng hạn

0509592
04-11-2009, 06:59 PM
uah!
bạn làm được từ PIC lên máy tính!
thì chiều ngượic lại cũng như vậy thôi!
cái này tôi làm lâu rồi, hơi thủ công!
trên PC bạn truyền theo khung dữ liệu của bạn giả sử data của bạn là: buffer = s2500 bạn tách data ra thành từng byte truyền xuống VDK cụ thể ở đây là 5 byte. Ở VDK khi bạn nhận lần lượt hết 5 byte dữ liệu (buffer). Sau đó bạn kiểm tra byte đầu tiên buffer[0] xem đó là tín hiệu điều khiển gì là start hay stop, hay tín hiệu đảo chiều! thì mới quyết định điều khiển DC. còn lại buffer[1 - 4] là giá trị bạn cần điều khiển, lúc này buffer[1 - 4] là dạng kí tự, bạn convert sang dạng integer để điều khiển! còn việc truyền lên PC thì tương tự!
chuc vui!

roi
06-11-2009, 10:49 PM
Mình hiểu ý bạn rồi, thực ra đây là vấn đề cũng hay gặp phải. Đầu tiên là bạn xác định frame truyền. Ví dụ như cách bạn đã làm, mình bổ sung thêm byte cuối:
+ byte mở đầu xác định mã lệnh
+ 2 byte data (bạn có thể tách ra từ số 16 bit vô tư)
+ byte kết thúc (vd 255)
Theo mình byte kết thúc này là cực kỳ quan trọng, kể cả khi truyền từ vi điều khiển lên hoặc nhận data từ máy tính. Sau khi nhận cả gói data, bạn kiểm tra byte cuối có phải 255 không, sau đó kiểm tra byte đầu xác định mã lệnh và data là 2 byte giữa, bạn nên đưa vào mảng để dễ dàng xử lý.
Mình xin lưu ý một điểm mà khi truyền nhận giữa vi điều khiển và máy tính hay gặp là kiểu data giữa bên truyền và bên nhận không giống nhau, bạn nên check kĩ điều này để tránh những sai sót không đáng có.
Chúc bạn thành công,

stupid11
20-03-2011, 05:59 PM
gui ban dung h

nếu muốn gửi nhiều hơn 1 byte thì để đơn giản hóa vấn đề bạn làm như sau:

khai báo 1 mảng hằng số,sử dụng ngắt truyền thông RDA

int mang[4]={}; // 4byte,có thể nhiều hơn.nhưng nhỏ hơn 255,
#INT_RDA
void_ngat()
{
data=getc();
mang[i]=data;
i++
}

//cứ mỗi lần nhận được 1 byte thì sẽ nhảy vào ngắt//

còn bạn muốn sử dụng byte nào thì chỉ việc lấy giá trị từng byte trong mảng đã nhận được...

mang[0]=...
mang[1]=...

còn frame truyền thì thường như sau byte1 byte2...byte n

byte 1 :địa chỉ,nếu truyền giữa 2 trạm thì khỏi cần
byte 2=>n-1 :data
byte n: kết thúc

chúc bạn thành công.