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 trên PC (http://www.picvietnam.com/forum/showthread.php?t=274)

chinh_coc 25-04-2009 12:59 AM

Mình đã xử lý được rồi. thanks các bạn đã giúp đỡ

Chỉ cần tách các kí tự nhận được ra rồi hiển thị lên là OK.

TANDEM 26-04-2009 12:23 PM

1 Attachment(s)
Vẫn là vấn đề giao tiếp qua RS 232. Hôm trước đệ có làm giao tiếp PC - RS 232 -PIC theo một chiều từ PC - PIC, phần giao tiếp với cổng COM trên máy tình thì dùng C# và đã gửi được tín hiệu qua PIC rồi, tuy nhiên đoạn chương trình ở PIC đệ viết bằng CCS và nó chạy không theo ý đồ của đệ 'ý của đệ là sau khi check được LED nào thì LED đó sẽ sáng cho đến khi nào không check nữa' Vậy nhờ các huynh chỉ giáo!
Đây là đạn code:

Code:

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define may1  RD0
#define may2  RD1
#define may3  RD2
#define may4  RD3
#define may5  RD4
#define on    1
#define off  0

char ch;

#INT_RDA
Receive_isr()
{
  if (kbhit())
  {
      ch = getc();
     
      if (ch=='a') may1 = on;
      if (ch=='b') may2 = on;
      if (ch=='c') may3 = on;
      if (ch=='d') may4 = on;
      if (ch=='e') may5 = on;
     
      if (ch=='f') may1 = 0;
      if (ch=='g') may2 = 0;
      if (ch=='h') may3 = 0;
      if (ch=='i') may4 = 0;
      if (ch=='j') may5 = 0;
     
  }
}
void main()
{
set_tris_d(0);
portd=0b00000000;
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while (1)
  {
  }
}


và kèm theo C# and protues:

namqn 26-04-2009 03:58 PM

Trích:

Nguyên văn bởi TANDEM (Post 25252)
Vẫn là vấn đề giao tiếp qua RS 232. Hôm trước đệ có làm giao tiếp PC - RS 232 -PIC theo một chiều từ PC - PIC, phần giao tiếp với cổng COM trên máy tình thì dùng C# và đã gửi được tín hiệu qua PIC rồi, tuy nhiên đoạn chương trình ở PIC đệ viết bằng CCS và nó chạy không theo ý đồ của đệ 'ý của đệ là sau khi check được LED nào thì LED đó sẽ sáng cho đến khi nào không check nữa' Vậy nhờ các huynh chỉ giáo!
Đây là đạn code:
...

Vậy hiện thời thì chương trình của bạn chạy ra sao?

Thân,

TANDEM 26-04-2009 04:11 PM

Em mô phỏng bởi Protues với cổng COMPIM, trên PC em tạo giao diện viết bởi C#, chương trình đã chạy và truyền tín hiệu qua PIC, nhưng khi check các boxcheck trên giao diện thì không theo ý muốn. Ví dụ: khi em check box 1 thì tương ứng với LED1 sáng sau đó chuyển sang check Box2 thì LED2 sáng [nhưng] LED1 lại tắt mất tương tự với các LED khác cũng vậy. Em đã nghiên cứu rất nhiều rồi!!!???

namqn 26-04-2009 04:20 PM

Trích:

Nguyên văn bởi TANDEM (Post 25259)
Em mô phỏng bởi Protues với cổng COMPIM, trên PC em tạo giao diện viết bởi C#, chương trình đã chạy và truyền tín hiệu qua PIC, nhưng khi check các boxcheck trên giao diện thì không theo ý muốn. Ví dụ: khi em check box 1 thì tương ứng với LED1 sáng sau đó chuyển sang check Box2 thì LED2 sáng [nhưng] LED1 lại tắt mất tương tự với các LED khác cũng vậy. Em đã nghiên cứu rất nhiều rồi!!!???

Bạn đang thao tác trực tiếp trên các bit của thanh ghi PORTD, điều này có thể dẫn đến hiện tượng như bạn đã thấy, do hiệu ứng read-modify-write của các lệnh thao tác bit trong PIC.

Bạn nên dùng một thanh ghi đệm, khởi tạo giá trị của nó bởi giá trị của PORTD, sau đó cập nhật các bit của thanh ghi đệm này và ghi vào PORTD, mỗi khi bạn muốn cập nhật 1 bit nào đó của PORTD.

Thân,

Nin 03-05-2009 10:49 PM

chương trinh dùng ngắt RDA rồi còn dùng kbhit() chi nữa... cái này dùng VB6 thấy dễ lắm mà.

TANDEM 16-05-2009 05:08 PM

1 Attachment(s)
Đây là code trong C# của đệ:
Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public bool open = true;
        public Form1()
        {
            InitializeComponent();
            Com4.DataReceived += new SerialDataReceivedEventHandler(Com4_DataReceived);
        }

        private void button_open_Click(object sender, EventArgs e)
        {
            if (open)
            {
                open = false;
                button_open.Text = "Đóng cổng";
                label3.Text = "Cổng Com đang mở";
                Com4.Open();
            }
            else
            {
                open = true;
                button_open.Text = "Mở cổng";
                label3.Text = "Cổng Com đang đóng";
                Com4.Close();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Com4.Close();
            Close();
        }

        private void Com4_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            String nhan = "";                                                        // Luu du lieu nhan
            if (sender == Com4)
            {
              nhan = Com4.ReadExisting().ToString();
              tBox_Recei.Text = tBox_Recei.Text +nhan;              //Lỗi xuất hiện ở dòng này
            }
        }

        private void button_trans_Click(object sender, EventArgs e)
        {
            if (Com4.IsOpen)
            {
                Com4.WriteLine(tBox_trans.Text);
                tBox_trans.Clear();
            }
            else  MessageBox.Show("Cổng COM chưa mở! Hãy mở cổng COM");
        } 
    }
}

Khi đệ dùng Terminal để gửi-nhận dữ liệu. Chiều từ C# đến Terminal thì rất tốt, chiều ngược lại thì C# báo lỗi. Đệ không biết là lỗi gì? Rất mong được các huynh chỉ giáo!

TANDEM 17-05-2009 09:38 AM

Sao không thấy huynh nào giúp mình vậy??!

TANDEM 18-05-2009 01:10 PM

Đến bây giờ đệ vẫn chưa tìm ra C# báo lỗi là do đâu? Khi đệ gửi chuỗi ký tự từ PIC lên nó cũng báo lỗi tương tự? Mong các huynh chỉ giáo!

Delfy_Coltech 26-05-2009 04:48 PM

Hi bạn TANDEM!
Mình đã xem Form truyền nhận dữ liệu viết bằng C# của bạn.
Mình có một vài góp ý nhỏ như sau:

- Để có một Form truyền nhận dữ liệu tối ưu hơn thì bạn nên viết thêm phần cho phép người dùng lựa chọn cổng COM. Ở đây có thể máy tính của bạn là COM4 nên mình thấy bạn chỉ để là COM4.
- Hàm truyền bạn dùng là Writeline, vậy thì hàm nhận cũng nên dùng là Readline.
Ở đây có lẽ mục đích truyền nhận chắc cũng không quá phức tạp (chưa cần đến chuyển đổi cơ số) nên dùng hai lớp này là cũng OK rồi.

Mình Test thử với Serial Port Monitor của CCS thì phần mềm của bạn vẫn ko thấy truyền nhận được.
Bạn xem lại nhé! Có j ta trao đổi tiếp

TANDEM 28-05-2009 11:50 PM

1 Attachment(s)
Cám ơn bạn Delfy_Coltech! Hiện mình vẫn đang vật lộn với việc truyền nhận đó.
- Cho phép lựa chọn nhiều cổng COM cũng như các thông số khác thì mình đã viết được rồi.
- Khi giao tiếp với Serial Port Monitor của CCS thì việc truyền nhận diễn ra hoàn toàn suôn sẻ, hai bên đều truyền và nhận đúng các số và ký tự.
Khi truyền từ PIC đến thì cả Serial Port Monitor của CCS và C# đều hiện các ký tự lạ. Mình không hiểu lý do tại sao??

thienkien 29-05-2009 08:30 PM

có lẽ bạn xem lại khai báo baurate
mình cũng đang gặp vấn đề khi dung hspll để nhân xung thạch anh (10M*4) thì truyền nhận bị sai, có ký tự lạ ( nếu khai báo 10M thì truyền nhận chính xác) , có lẽ là sai baurate( ko biết có cần phải tính lại baurate ko nhỉ, ví dụ :nhân 4, hoặc chia 4 chăng hạn??)

TANDEM 30-05-2009 12:09 AM

Mình chưa hiểu hết ý bạn thienkien. Mình đã thay đổi tần số bằng 10M rồi nhưng vẫn không đạt được kết quả truyền chính xác.

thienkien 30-05-2009 06:55 AM

1 Attachment(s)
hi TanDem! hôm qua mình chưa xem kỹ câu hỏi của bạn,bạn dùng thạch anh thực bao nhiêu thì khai báo bấy nhiêu thôi!! theo mình bạn nên thêm 1 ký tự để nhận biết kết thúc chuỗi :ví dụ ký tự '\13' chăng hạn: Com4.WriteLine(tBox_trans.Text+(char)13);

ban thử đoạn code dưới PIC này xem:
#include<16f877a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,pari ty=N)
#use fast_io(b)
int8 dodai,dem=0;
int input_ready;
char mang[50];

#int_rda
void nhan()
{
//disable_interrupts(int_timer0);
//if(kbhit())
mang[dem]=getc();
putc(mang[dem]);

if(mang[dem]==0x0d)
{
dodai=dem;
mang[dem]='\0';
input_ready=1;
dem=0;

}
dem++;


// enable_interrupts(int_timer0);

}

void main()
{
int16 i,j;

input_ready=0;
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_rda);
output_b(0);
while(1)
{
if(input_ready==1)
{

printf("CHUOI=%s",mang);
input_ready=0;
dem=0;
}

//co the xuat ra portB de kiem tra bang led ne
for(j=0;j<dodai-1;j++)
{
output_b(mang[j]);
delay_ms(500);

}
}
}



nếu ko được bạn tải cái rs232tester về kiểm tra nhé

TANDEM 31-05-2009 03:44 PM

Hi thienkien, dù sao cũng cám ơn bạn. Nhưng hình như tôi thì ở trái đất còn bạn thì ở sao hỏa rồi cả hai đều ngồi trên chiếc cân.... Sau đó thì thế nào nhỉ?


Múi giờ GMT. Hiện tại là 01:55 PM.

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