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)
-   -   Lập trình giao tiếp RS232 trên PC bằng Visual C++.Net (http://www.picvietnam.com/forum/showthread.php?t=1145)

tinhgiac_vp 16-04-2009 06:39 PM

Em đang làm giao tiếp RS232 sử dụng C#. Nhưng chương trình không xử lý lệnh serialport1.close(). Mong mọi người chỉ giáo.
Đây là code C#.
Code:

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

namespace viduRS232
{
    public partial class Form1 : Form
    {
        public string s;
        public ArrayList arr = new ArrayList();
        public int id;
        public Form1()
        {
            InitializeComponent();
            id = 0;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.Close();
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(display));
        }
        private void display(object sender, EventArgs e)
        {
            int flag;
            int c;
            c = serialPort1.ReadChar();
            //string s1 = "";
            s = "";
            flag = 0;
            if (c == 's')
            {
                flag = 1;
                while (flag == 1)
                {
                    c =serialPort1.ReadChar();
                    if (c == 'S')
                    {
                        //textBoxdisplay.Text = s1;
                        flag = 0;
                    }
                    else
                        s += Convert.ToChar(c);
                }
                arr.Add(s);
                id++;
                if (id == 2)
                {
                    serialPort1.Write("S");
                }
                //serialPort1.Write("s");
               
                //this.textBoxdisplay.Text = s;
            }
        }

        private void buttonRead_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            serialPort1.DataReceived +=new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Write("s");
            //id = 1;
            //while (id == 1) ;
        }

        private void buttonClose_Click(object sender, EventArgs e)
        {
            //this.Dispose();
            //this.serialPort1.Close();
            this.Close();
        }

        private void buttondisplay_Click(object sender, EventArgs e)
        {
            this.textBoxdisplay.Text = Convert.ToString(arr[0]);
            this.textBox1.Text = Convert.ToString(arr[1]);
            this.textBox2.Text = Convert.ToString(id);
            //serialPort1.Write("s");
            this.serialPort1.Close();
        }
    }
}

Còn đây là code PIC
Code:

#include <18f4331.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud = 9600,parity = n,xmit = pin_C6,rcv=pin_C7)
#include <LMB162A.c>
int flag;
void lcd_putstr(char *buffer);
#int_rda
void ngat_rs232()
{
  if(flag==0)
  {
      printf("sxyzS");
  }
  if(flag==1)
  {
      printf("sabcS");
  }
  if(flag==2)
  {
      printf("s123S");
  }
  if(flag==3)
  {
      printf("s456S");
  }
  putc('\0');
  flag++;
}
void main()
{
  int id;
  char c;
  char s[] = "hello";
  //char s1[] ="s123456789S";
  //char s2[] = "s987654321";
  enable_interrupts(global);
  enable_interrupts(int_rda);
  delay_ms(50);
  lcd_init();
  delay_ms(10);
  printf(lcd_putc,"hello");
  flag = 0;
  //while(flag==0)
  //{
    // printf("s123456S");
  //}
  //lcd_putc('\f');
  id = 1;
  while(id==1)
  {
      c = getc();
      if(c=='S')
      {
        id = 0;
        //sable_interrupts(int_rda);
      }
  }
  //able_interrupts(int_timer1);
  printf(lcd_putc,"xong");
}
void lcd_putstr(char *buffer)
{
    unsigned int i = 0;
    while (buffer[i] != '\0')
    {
        lcd_putc(buffer[i]); /* calling another function */
                                /* to write each char to the lcd module */
        i++;
        delay_us(10);
       
    }
}

Cho em hỏi thêm là hàm ngắt RDA hình như ngắt liên tục không dừng. Em disable_interrupts(int_rda) thì nó không chạy được hàm lcd_putc(), hình như nó tắt timer gì đó. Các cao thủ giải thích vấn đề này giúp em với, và khắc phục nó như thế nào?

namqn 16-04-2009 07:14 PM

Trích:

Nguyên văn bởi tinhgiac_vp (Post 24855)
...
Cho em hỏi thêm là hàm ngắt RDA hình như ngắt liên tục không dừng. Em disable_interrupts(int_rda) thì nó không chạy được hàm lcd_putc(), hình như nó tắt timer gì đó. Các cao thủ giải thích vấn đề này giúp em với, và khắc phục nó như thế nào?

Câu hỏi giống như thế này đã được tôi trả lời ở một luồng khác, nhưng tôi sẽ nói lại. Với PIC 8-bit, khi có ngắt nhận dữ liệu từ USART, bạn cần đọc thanh ghi RCREG để giải phóng nó và xóa cờ ngắt RCIF (đây là cách duy nhất để xóa cờ ngắt này). Nếu bạn không thực hiện việc đọc RCREG (đọc vào một biến tạm nào đó nếu không cần dùng giá trị thanh ghi) thì cờ ngắt RCIF sẽ không được xóa, dẫn đến ngắt nhận dữ liệu từ USART liên tục như bạn đã thấy.

Thân,

tinhgiac_vp 20-04-2009 06:49 PM

cám ơn trưởng lão nhiều. Còn vấn đề lệnh Serialport1.close() không được thực hiện khi đặt lệnh đó trong hàm ngắt sự kiện data_receive, trưởng lão và các cao thủ có thể chỉ em nguyên nhân không ạ?

tannocdt06 23-05-2009 04:46 AM

các bác có file.dll nào mà khi add vào thanh toolbox thì visual C++.net có thể giao tiếp ra bên ngoài qua cổng USB. có thì share cho mình nghen ,cám ơn rất nhiều .

Delfy_Coltech 24-05-2009 01:14 PM

Chương trình của Bắc rất hay! Tuy nhiên cũng còn nhiều trường hợp cần bắt lỗi!
Đúng là ta nên thử nghiệm viết các ứng dụng trên các công cụ mới hơn.
Mình thấy hỗ trợ lớp Serial Port Communication của bộ Visual Studio 2005 là rất mạnh!
Hi vọng là sẽ được học hỏi nhiều ở các bạn và các A đi trước!

To tinhgiac_vp:
Ở đây mình thấy mấy chỗ bạn sử dụng lệnh serialPort1.close()
Không biết là chương trình mắc lỗi ở chỗ nào
- Mình cũng ko hiểu tại sao bạn lại close luôn kết nối khi load form vậy?

private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Close();
}

Bạn nên gửi kèm file chương trình để mọi người cùng test thì tốt hơn!
Và một điều lưu ý khi lập trình đó là các câu lệnh được dịch theo thứ tự từ trên xuống dưới. Do vậy, có khi cả đoạn code là đúng nhưng chỉ là cái cần làm trước lại đặt ở sau thì chương trình cũng không cho kết quả chính xác!
Hihi! Thân chào.
Delfy

thanhtien293 05-03-2010 07:57 AM

các bạn và các anh cho hỏi làm thế nào để add được lớp MSComm trong VC++2005. mình tìm không thấy

metghe1 08-05-2010 01:21 PM

khi đã gửi dữ liệu từ máy tính rồi. Làm thế nào để nhận chuỗi rồi hiển thị lên led ma trận vậy các tiền bối

minhduc_bn 18-01-2011 03:34 PM

e học cơ điện tử không đc học nhiều về vi điều khiển lắm. giờ em đang làm đề tài điều khiển động cơ giao tiếp với máy tính qua cổng com với pic 18f4431. dùng ngôn ngữ ccs c. moi người có thể giúp em phần giao tiếp với cổng com rs232 phần tài liệu đc ko. em xin cám ơn

ngohung.pro 21-02-2011 10:39 PM

minh dang lam mach dieu khien led bang c++.noi dung :sang tat sen ke,sang don tat don,dem nhi phan va co nut nhan dieu khien ,neu nhan nut thi led se chay trang thai khac. mong cac pac giup minh voi.cam rat nhieu do!

ngohung.pro 21-02-2011 11:11 PM

minh dang lam mach dieu khien led bang c++.noi dung :sang tat sen ke,sang don tat don,dem nhi phan va co nut nhan dieu khien ,neu nhan nut thi led se chay trang thai khac. mong cac pac giup minh voi.cam rat nhieu do!

lucky89 16-03-2011 09:06 PM

Các anh các chị ơi ! a chị nào có tài liệu giao tiếp RS232 trên PC dùng C# ko ạ ?
Nếu anh chị nào có làm ơn gửi vào mail phamtuan.kc@gmail.com cho em với ạ !
E xin chân thành cảm ơn và hậu tạ anh chị !

thoapro89 10-09-2011 12:05 PM

em dùng visual studio 9 2008 c++ thì làm sao anh ơi

boydt0990 29-09-2011 11:09 PM

a co the giup e dc ko
e dan lam mach dem san pham hien thi lcd ma bay gio
ko biet bat dau tu dau a co the chi giao e ko

engineering 31-12-2011 07:51 PM

Dạ em xin chào các anh trên 4rum và anh Bắc. Anh giúp em viết thêm tính năng vẽ đồ thị dữ liệu nhận được từ cổng COM do vi điều khiển gửi lên PC được không ạ. Em đang làm cái này cho luận văn, nhưng bị bí mất anh!
p/s: dữ liệu vđk sau khi thực hiện chuyển đổi ADC và truyền UART cho PC liên tục.

Em cảm ơn các anh nhiều!!!

daretowin 17-04-2012 04:30 PM

Mình cũng đang làm truyền gửi dữ liệu để điều khiển Robot.

Ở trên máy tính mình viết code gửi xuống như sau: (để điều khiển rẻ trái rẻ phải, tới lùi...)

private void forward_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("0#");
STATUS.Text = "ROBOT FORWARD";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}
private void turnleft_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("1#");
STATUS.Text = "ROBOT TURN LEFT";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}

private void stop_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("2");
STATUS.Text = "ROBOT STOPPING";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}

private void turnright_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("3");
STATUS.Text = "ROBOT TURN RIGHT";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}




Bên vi điều khiển Pic mình viết code nhận như sau(không hiểu nhận như thế này có đúng không), mà kết quả mình nhận được là mạnh đứng chả có hiện tượng chi hết.

#include <16F877A.h>
#include <def_16F877A.h>
#device *=16
#fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT //khai bao cac thiet dat cho PIC
#use delay(clock=4000000)
#bit rc0 = 0x07.0 //khai bao su dung thach anh 20MHz de su dung ham delay cua chuong trinh
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7)
/************************************************** ***********************************/
signed int8 y=0;
#INT_RDA
VOID RECEVICE()
{
y=getc();

}
void main()
{
rc3=0;
enable_interrupts(global);
enable_interrupts(INT_RDA);
while(true)
{
if(y==0)
{ rephai();
}
if(y==1)
{
retrai();
}
}
}............





Mong các cao thủ giúp mình, mình dùng lệnh gửi serialPort1.Write("2");
Thì lệnh nhận ở vi điều khiển if(y==2) có đúng không? Hay nó sẽ hiểu theo kiểu HEX của kí tự "2" ạ ?

daretowin 15-05-2012 05:30 PM

Mình đã làm được cám ơn.........

magic_boy_1989 05-06-2012 12:30 PM

cứu e với moi người ơi, e làm như tut của anh NHB nhưng vẫn không chạy .e dùng vs++2010 ,capusb to com dùng chip pl2303,chương trình gửi từ vdk lên thì nhận ( nếu dùng terminal hoặc chuong trinh vb ) nhưng code e làm theo anh NHB thì không đọc được ! E thử dùng ct của a NHB đóng gói nhưng vẫn không chạy .Mấy bác giúp e với e cần gấp gấp lắm !
code e post ở đây :
http://www.dientuvietnam.net/forums/...2010-a-123553/

IsIgnorant 07-10-2012 02:15 AM

Giúp đỡ giao tiếp rs232 và máy tính
 
mình đang làm một chương trình nho nhỏ giao tiếp giữa rs232 và máy tính đơn giản là dùng phần mềm viết bằng c# để bật tắt đèn LED. Vậy ai có code hoặc có tài liệu liên quan thì send cho mình với ( vì mình cũng mới tìm hiểu về vi điều khiển cũng như PIC 16f887A) nếu có code c# và code mô phỏng trên proteus thì càng tốt . Mong mọi người giúp đỡ nha .


Múi giờ GMT. Hiện tại là 03:04 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