PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   giao tiếp rs232 (http://www.picvietnam.com/forum/showthread.php?t=2959)

ndc 18-10-2008 05:57 PM

giao tiếp rs232
 
xin chào các bác
em mới học pic, em có một thắc mắc muốn hỏi các bác:
em dùng con 877a để nhận dữ liệu từ pc , nhưng em mới chỉ nhận dc 1 kí tự thôi.VD:em truyền kí tự "a"từ pc thì nó nhận dc
nhưng em muốn nhận dc 1 chuỗi kí tự ,nhưng kho biết phải lập trình cho nó thế nào.
vd như em muốn truyền chữ "hello" từ pc , thì ở vđk cũng nhận dc từ "hello" rồi sau đó nó truyền lại cho pc.
Mong các bác sớm giúp em!!!!
thanku

nguyenquoctoan 20-10-2008 12:17 AM

bạn làm như vậy nè(mình đã làm như vậy với vb)
-trong vb xác định độ dài chuỗi cần truyền, giả sử là 4 ký tự đi,nuế chưa đủ thì thêm 0 trước vô,đủ rồi thì thôi...
-dưới vi điều khiển xác định số ký tự nhận là 4 nhận đủ thì thôi(dùng vòng lặp for)

naivatho 20-10-2008 10:37 PM

Bạn toàn ơi.Bạn chỉ giúp mình code viết cho Pic để nó nhận kí tự mà bạn truyền xuống được không?
Mình cũng dùng truyền nhận VB mà mình mới truyền được thôi chứ mình viết code cho Pic nhận chưa được
Mình củng học BKTPHCM nhưng mình học bên cơ khí,mà muốn học điện cho biết
có gì bạn gởi mail cho mình được không
hhtien192@yahoo.com
ai biết thì chỉ giúp mình với
Thanks các bác nhiều!!!!!
Chúc các bác tuần mới vui vẻ!!!

nguyenquoctoan 20-10-2008 11:22 PM

đoạn code có thể viết đơn giản như sau:
void getvalue()
{
int16 x;
int i;
char s[4]; “khai bao s 4 byte,so luong byte truyen xuong
for(i=0;i<4;i++)
s[i]=getc(); “nhan s vao tu tu dang chuoi,so ky tu trong moi chuoi
x=atol(s); “chuyen chuoi sang so
y=x;
printf("%lu",x); “xuat gia tri x ra pc so ko dau
}
hàm nhận dữ liệu từ vb đơn giản như sau, số lượng ký tự truyền và nhận phải đồng nhất
trong hàm chính
while(1)
{
if (y==0)
getvalue();
}
bạn bổ sung mấy khai báo khác, chạy ok thôi

dvnccbmacbt 21-10-2008 01:17 AM

các bạn có thể dùng lệnh gets(str) để nhận 1 chuỗi ký tự từ máy tính. sau đó muốn làm j với chỗi đó cũng được. Mình gửi 1 ví dụ mình đã làm và đã chạy ok:
Code:

#INT_RDA
void ngat_serial()
{
  gets(str); \\ NHAN CHUOI KY TU

  printf("%s\r",str); \\GUI TRA CHUOI KY TU

 //-------THAO TAC VOI CAC PHAN TU CUA CHUOI----//

  if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='p'))          fini = 1;
  else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='i'))    fini = 2;
  else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='d'))    fini = 3;
  else if ((str[strlen(str)-2]=='1')&&(str[strlen(str)-1]=='v'))    fini = 4;
  else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='p'))    fini = 5;
  else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='i'))    fini = 6;
  else if ((str[strlen(str)-2]=='2')&&(str[strlen(str)-1]=='d'))    fini = 7;
  else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='p'))    fini = 8;
  else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='i'))    fini = 9;
  else if ((str[strlen(str)-2]=='3')&&(str[strlen(str)-1]=='d'))    fini = 10;
  else if ((str[strlen(str)-2]=='v')&&(str[strlen(str)-1]=='m'))    fini = 11;
  else if ((str[strlen(str)-2]=='a')&&(str[strlen(str)-1]=='m'))    fini = 12;
  else if ((str[0]=='o')&&(str[1]=='n'))    on = 1;
  strncpy(value,str,strlen(str)-2);

 // ----------------
}

Hi vọng giúp được các bạn.

naivatho 22-10-2008 05:35 PM

Bác Toàn ơi! sao em viết code như bác thế mà pic vẫn không nhận và xuất lên máy tính được
em viết code của bác khi dịch vẫn dịch được
và chương trình VB của em cũng send và nhận được khi e nối chân 2 và 3 lại với nhau
Nhưng khi kết hợp lại thì k được.
Mong bác sớm giúp đỡ

naivatho 22-10-2008 05:41 PM

Bác dvnccbmacbt
code của bác e đọc chưa hiểu hết nơi,nhất là đoạn code sau if.
bác chú thích giúp em được k ạ,e cũng muốn pic nhận chuỗi kí tự mà trên VB em truyền xuất sau đó xuất ra led ma trận mà chưa làm được,em đã có mạch và chương trình trên vb truyền được rồi ạ
vì em mới học nên mong bác sớm giúp đỡ

maiduy082 22-10-2008 08:48 PM

Trích:

Nguyên văn bởi naivatho (Post 19798)
Bác dvnccbmacbt
code của bác e đọc chưa hiểu hết nơi,nhất là đoạn code sau if.
bác chú thích giúp em được k ạ,e cũng muốn pic nhận chuỗi kí tự mà trên VB em truyền xuất sau đó xuất ra led ma trận mà chưa làm được,em đã có mạch và chương trình trên vb truyền được rồi ạ
vì em mới học nên mong bác sớm giúp đỡ


phần trên là nhận ký tự từ pc gửi ra ,còn sau đó là thao tác bạn dùng cho chuỗi ký tự đó thôi .
đoạn if chỉ la ví dụ thôi .
hay là bạn muốn biết chính xác đoạn code đó có chức nạng gì ???

nguyenquoctoan 22-10-2008 08:51 PM

mình truyền giá trị 0<X<1000 cho bạn xem như sau
khi truyền và nhận tất cả phải ở dạng chuỗi
code vb:
rstr = txttruyen.Text 'dữ liệu cần truyền
If (Val(rstr) < 1000) And (Val(rstr) > 0) Then
l = Len(rstr) ‘gan l cho do dai c
If (l = 1) Then
rstr = "000" + rstr
End If
If (l = 2) Then
rstr = "00" + rstr
End If
If (l = 3) Then
rstr = "0" + rstr
End If
End If
If rstr = "" Then
' do anything if u want
Else
Call MoPort_Click 'goi hàm mở port khai báo thông số cần truyền
MSComm1.Output = rstr 'truyền dữ liệu xuống
End If
code c
#include<16f877a.h>
#device PIC16F877a*=16 ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
//hàm nhận dữ liệu
void getvalue()
{
int16 x;
int i;
char s[1]; //khai báo số lượng chuỗi truyền
for(i=0;i<4;i++) //số ký tự truyền xuống
s[i]=getc(); //nhan s vao tu tu dang chuoi
x=atol(s); //chuyen chuoi sang so
y=x; //số bạn cần truyền đây
printf("%lu",x); “xuat gia tri x ra pc so ko dau
}
//hàm main
void main()
{
while(1)
{
if (y==0)
getvalue();
}

}
hi vọng giúp được bạn

dvnccbmacbt 22-10-2008 10:17 PM

đoạn code sau if không cần hiểu đâu. Mình chỉ minh họa thao tác với chuỗi thôi mà. Đoạn đó tùy ứng dụng của ban. Còn câu lệnh
[code]
gets(str);
[\code]
là nhận 1 chuỗi ký tứ cho đến khi nhận được ký tự kết thúc là "\r".

le.nhatcuong 23-10-2008 07:47 AM

#include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A2, rcv=PIN_A3)
int8 ch;

void main(void)
{
while(true)
{
ch = getc();
if (ch!=0)
{
putc(ch);
}
}
}

naivatho 23-10-2008 10:11 PM

Em cám ơn các bác nhiều!!!
Để em thử xem em truyền và nhận được không rồi em liên hệ các bác giúp đỡ!!!
Đa tạ các bác

le.nhatcuong 25-10-2008 01:18 AM

đoạn mã trên đơn giản nhất, khi nhận được sẽ truyền len PC lai đúng ký t75 vừa nhận

thanhduy_meo 28-10-2008 08:20 AM

chào các pác! tui đang gặp khó khăn về giao tiếp vdk với máy tính.cụ thể là giao tiếp AVR với PC điểu khiển bằng VB6 hiển thị nhiệt độ con LM35.các cao thủ xin chỉ giúp với.tui khó khăn ở khâu truyền nhận làm sao VB nó lấy tín hiệu từ con AVR đấy.Xin cảm ơn các bạn trước hen.

namqn 28-10-2008 07:20 PM

Trích:

Nguyên văn bởi thanhduy_meo (Post 19918)
chào các pác! tui đang gặp khó khăn về giao tiếp vdk với máy tính.cụ thể là giao tiếp AVR với PC điểu khiển bằng VB6 hiển thị nhiệt độ con LM35.các cao thủ xin chỉ giúp với.tui khó khăn ở khâu truyền nhận làm sao VB nó lấy tín hiệu từ con AVR đấy.Xin cảm ơn các bạn trước hen.

Với những vấn đề liên quan đến AVR, bạn có thể hỏi tại www.dientuvietnam.netwww.avrvietnam.com.

Thân,


Múi giờ GMT. Hiện tại là 05:18 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam