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)

hoan_spkt 13-11-2007 08:39 PM

Mỉnh cũng tạo giao diện Cổng Com nhưng dùng visual 2005.net.Mình truyền đc data (dạng text) rùi nhưng nếu dùng lisbox để nhận & hiện thị data thì chỉ hiện đc 1/2 thôi.
nếu mình muốn truuyền 1 file thì có đc ko ? Xin các bác chỉ giáo nha......thanks !

hovanminh 14-11-2007 04:22 PM

chuoi
 
Chao cac bao , no chang khac chi Terminal cua Win ca. Upload code len cho anh e, dung co le tot hon

rmitoday 16-11-2007 10:47 AM

Chương trình của Bắc có xài overlapped I/O không? Có sử dụng multithread để xử lý riêng biệt không? Mình cũng hay viết chương trình giao tiếp bằng VC nay muốn chuyển qua .NET nên quan rất quan tâm vấn đề này. Còn chuyện tự động detect COM (physical or virtual) plug/unplug thì cũng đơn giản thui hè. Tốt nhất nên share source code để anh em cùng đóng góp kinh nghiệm.

rmitoday 16-11-2007 10:54 AM

Trích:

Nguyên văn bởi dotuanphong (Post 10990)
Chào các bạn!
Tôi có chương trình cân lấy dữ liệu từ đồng hồ cân qua công com máy tính, chương trình viêt bằng fox 2.6 win chạy trên Win 98, nay tôi cài upgrade win XP thì chương trình không còn đọc được dữ liệu qua cổng com nữa. Như vây mình có thể khắc phục được không, xin các bạn giúp dùm nhé!

Trong window 95/97/98 cho phép chương trình truy xuất phần cứng trực tiếp bằng các hàm in/out port. Còn từ windows 2000/XP trở đi việc truy xuất phần cứng phải thông qua driver hoặc hàm API của windows. Chương trình cân viết bằng Foxpro 2.6 của bạn có lẽ phải viết lại phần giao tiếp với cổng COM.

dangtq84 25-04-2008 03:12 AM

Bác Bắc giúp em với !
 
Em đang làm đồ án về mobile robot. Em muốn viết một chương trình điều khiển để điều khiển robot thực hiện một số chức năng đơn giản như: tiến,lùi,rẽ trái,rẽ phải. Trên giao diện điều khiển chỉ cần các nút button để thực hiện các chức năng trên. Em thông qua cổng COM để giao tiếp với vi xử lý . Nhưng giờ em không biết xuất tín hiệu điều khiển như thể nào cả. Xuất các string thi em làm được rồi còn cái điều khiển thì chịu. Em đang dùng VC++ để viết code. Bác giúp em đi ạ, mail của em là: dangtq84@gmail.com

ngohaibac 28-04-2008 11:24 PM

Trích:

Nguyên văn bởi dangtq84 (Post 15772)
Em đang làm đồ án về mobile robot. Em muốn viết một chương trình điều khiển để điều khiển robot thực hiện một số chức năng đơn giản như: tiến,lùi,rẽ trái,rẽ phải. Trên giao diện điều khiển chỉ cần các nút button để thực hiện các chức năng trên. Em thông qua cổng COM để giao tiếp với vi xử lý . Nhưng giờ em không biết xuất tín hiệu điều khiển như thể nào cả. Xuất các string thi em làm được rồi còn cái điều khiển thì chịu. Em đang dùng VC++ để viết code. Bác giúp em đi ạ, mail của em là: dangtq84@gmail.com

Điều khiển là nhiệm vụ của cấp dưới ở phần mạch chịu trách nhiệm chứ. Còn ở trên PC cậu chỉ phải gửi code lệnh thôi.

Ví dụ: thằng PIC chẳng hạn nhận dc kí tự A thì tiến chẳng hạn. Thế thôi.

Đó là bắt tay của 2 phần mà.

katadfg 14-05-2008 12:57 AM

Cậu có thể cho mình xin tài liệu về vấn đề này mà viết bang VC++ ko Bắc, nếu có thì mình cảm ơn. Email của minh: hanhkhucbachkhoa@gmail.com

phucvinh885 12-07-2008 03:22 PM

bó tay
lúc thì VC++ 6, lúc thì VC++.net, lúc thì basic...
em chả hiểu là nên dùng caí nào
cái nào có thể truyền và nhận dữ liệu qua PIC 16f877a và điều khiển thông qua PIC
em thấy các anh nói triền miêm ,
mà cái nào cũng dở dang
bọn em đã gà thì chớ
chả hiểu gì hết

Billinstructor 24-12-2008 11:14 AM

Cậu có thể hướng dẫn mình cách làm chương trình thường trú trong windows với Visual Basic 6.0 không? vì mình muốm viết một chương trình thường trú đọc dữ liệu từ RS232. Chi tiết đoạn code càng tốt. Cảm ơn nhiều

nhuhuynhcd 05-04-2009 12:04 PM

anh ơi có phần mạch test ko? e dang làm phần giao tiếp rs232 dùng VC++ a có thể gửi cho e phần mạch test mach nguyên lý với hướng dẫn k? mail của e là thienduongxanh836@yahoo.com thank

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


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