Lập trình giao tiếp RS232 qua Matlab

Chào các bạn.

Mình xin tổng hợp lại một số bài viết của mình về lập trình giao tiếp RS232 trên PC bằng phần mềm Matlab.

I. Đối tượng Serial Object

Việc giao tiếp này cũng rất dễ dàng thực hiện, không có gì là quá cao siêu cả. Mình đã giao tiếp thành công rùi. Để test nó các bạn hãy đấu tắt 2 chân 2 và 3 (TX và RX) của cổng COM lại.
Đầu tiên mình sẽ đưa ra môt chương trình thật là đơn gian, thiết lập ít tham số, còn chi tiết về thiết lập tham số nó thế nào? ý nghĩa ra sao? thì sẽ nói sau, mình cứ làm đơn giản trước rùi phức tạp -> hiểu hết về thiết lập này sau.
Bài này mình giới thiệu cách tạo đối tượng, kết nối, viêt hàm callback.
Tạo đối tượng:
Chúng ta gõ lệnh và kết quả hiện luôn (nhớ là k có dấu ; ở cuối lệnh

>> s = serial('COM1')

   Serial Port Object : Serial-COM1

   Communication Settings
      Port:               COM1
      BaudRate:           9600
      Terminator:         'LF'

   Communication State
      Status:             closed
      RecordStatus:       off

   Read/Write State
      TransferStatus:     idle
      BytesAvailable:     0
      ValuesReceived:     0
      ValuesSent:         0

Như vậy đối tượng là Serial-COM1, tốc độ 9600,..

Tiếp theo, chúng ta xem các tham số của đối tượng như thế nào bằng lệnh get(s):

>> get(s)
    ByteOrder = littleEndian
    BytesAvailable = 0
    BytesAvailableFcn =
    BytesAvailableFcnCount = 48
    BytesAvailableFcnMode = terminator
    BytesToOutput = 0
    ErrorFcn =
    InputBufferSize = 512
    Name = Serial-COM1
    ObjectVisibility = on
    OutputBufferSize = 512
    OutputEmptyFcn =
    RecordDetail = compact
    RecordMode = overwrite
    RecordName = record.txt
    RecordStatus = off
    Status = closed
    Tag =
    Timeout = 10
    TimerFcn =
    TimerPeriod = 1
    TransferStatus = idle
    Type = serial
    UserData = []
    ValuesReceived = 0
    ValuesSent = 0

    SERIAL specific properties:
    BaudRate = 9600
    BreakInterruptFcn =
    DataBits = 8
    DataTerminalReady = on
    FlowControl = none
    Parity = none
    PinStatus = [1x1 struct]
    PinStatusFcn =
    Port = COM1
    ReadAsyncMode = continuous
    RequestToSend = on
    StopBits = 1
    Terminator = LF

Các bạn thấy là có rất nhiều tham số phải không? chúng ta ở đây quan tâm đến tham số: BytesAvailableFcn tham số này chưa thết lập. Tham số này chính là hàm callback mà nó sẽ gọi khi có byte nhận được ở bộ đệm nhận.Vậy chúng ta viết hàm này chính là viết hàm OnComm đáp ứng sự kiện ReceiveEvent như trong MSCOMM của MS vậy.

Thiết lập này phải thực hiện trước khi mở cổng để giao tiếp, nên chúng ta sẽ viết hàm callback trước. Bạn viết 1 m-file với tên Serial_Callback.m như sau:

function Serial_Callback(obj,event)
    ind = fscanf(obj)

Cú pháp của hàm callback như trên với obj là đối tượng kiểu Serial như trên. Hàm có tác dụng đọc dữ liệu và hiển thị luôn kết quả lên command window.

Chúng ta đưa tham số tên hàm vào cho đối tượng s của ta:

>> s.BytesAvailableFcn = @Serial_Callback;

Tiếp theo chúng ta bắt đầu giao tiếp:

>>fopen(s);
>>fprintf(s,"chao cac ban");

Sau đó các bạn xem kết quả thế nào, sau đó thử truyền các kí tự khác xem bằng lệnh fprintf(s,...), hoặc thử với vi xử lý xem cho nó truyền lên các bạn sẽ thấy rất hay.

Bạn không giao tiếp nữa thì đóng cổng lại:

>>fclose(s);

2. Chương trình RS232 Communication

Đây là  chương trình mình viết dùng GUI, đã test với mạch FPGA Spartan 3E rồi.

Cách dùng:

1/ Chọn tham số cho Rs232 rùi ấn nút Connect để bắt đầu kết nối với RS232 nhé.

2/ Nhập dữ liệu vào ô TX rùi nhấn nút Send để gửi dữ liệu.

3/ Để thay đổi tham số (tốc độ, ..) cho RS232 thì phải nhấn Disconnect trước rùi chỉnh tham số nhé. Sau đó quay lại bước 1.

Các bạn chú ý, đây là chương trình mình viết dưới dạng mở, tức là các bạn có thể thêm code vào các hàm để phục vụ mục đích của mình. Đó chính là các hàm ngắt nhận, ngắt gửi,...  BytesAvailableFcnCount là số byte nhận được trong bộ đệm nhận trước khi xảy ra ngắt nhận.

Các hàm đó là:

  • function ByteAvailable_Callback(obj, event)
  • function OutputEmpty_Callback(obj, event)
  • function Error_Callback (obj, event)
  • function PinStatus_Callback(obj, event)
  • function Timer_Callback (obj,event)
  • function BreakInterrupt_Callback(obj, event)
  • Khi các bạn muốn thao tác với dữ liệu vừa nhận được thì các bạn edit thêm code trong hàm sau:

    function ByteAvailable_Callback(obj, event)

    Các bạn hãy lấy chương trình này thử xem mình viết ra sao nào :D.

    Tải chương trình: RS232 Communication (2670)

    { 88 comments… add one }
    • Le Minh Kha May 16, 2008, 12:33 am

      Chào anh Ngô hải Bắc.
      Mình có ý định tìm hiểu và thực hiên 1 mạch đo và ghi nhận nhiệt độ môi trường (lưu vào file) động thời có thể gửi tin nhắn SMS cảnh báo khi quá một mức ngưỡng quy định.
      Mình định sử dụng IC 89c51, giao tiếp với máy tính qua cổng RS232 và sử dụng chương trình Matlab.
      Tạm thời mình định ghi nhận nhiệt độ lưu vào file trước (phần cảnh báo sẽ nghiên cứu sau).
      Ý tưởng mình thế này:
      Dùng cảm biến nhiệt –> ADC–> 89c51–>max232–> PC.
      Nếu anh có ý tưởng hay tài liệu gì hay, mong anh giúp đỡ. Thank anh trước.

      Reply
    • nqquan June 16, 2008, 9:29 am

      Chào bạn.Mình dùm chương trình MATLAB-RS232 của bạn nhưng nếu tự gửi, tự nhận thì oki.Nhưng nếu nhận data từ nguồn ngoài (PIC) thì ko hiển thị lên được.

      Reply
      • hieu November 30, 2010, 5:26 pm

        Anh nqquan a.em muốn vẽ đồ thị từ tín hiệu vi điều khiển qua rs232 hiển thị mô phỏng thời gian thực sử dụng matlab thì làm như thế nào ạ? tín hiệu nhận từ vdk của matlab có dạng 1 2 4 5 ví dụ như vậy.bây giờ làm thế nào để hiển thị nó trên dồ thị matlab :?có gì anh giúp em mới:anh gửi vào địa chỉ mail:hieu.tranthe@gmail.com anh biết thì giúp em với thank!

        Reply
    • Minh Tâm November 12, 2008, 7:02 pm

      Em sử dụng chương trình giao tiếp máy tính của anh để giao tiếp với VDK và gặp các vấn đề sau. Anh xem và giúp em giải quyết với nhé. Em đang nghiên cứu nhưng chưa ra nên hỏi anh, nhờ giúp đỡ. Chân thành cảm ơn.
      Minh Tâm:

      Quá trình truyền dữ liệu thành công nhưng gặp phải những vấn đề sau:
      Khi truyền từ máy tính xuống VDK thì, giá trị >10 truyền xuống VDK không nhận được.
      Khi truyền từ VDK lên máy tính thì:
      Truyền 0 nhận được là 128 và cứ thế tăng lên( truyền 1 nhận là 129) tuy nhiên khi truyền đến giá trị 31 tức nhận được là 159 thì OK nhưng đến 32 tức phải nhận được 160 thì không đúng mà chỉ nhận được 128, lặp lại như cũ.
      Đó là các vấn đề em gặp phải. Anh chỉ giúp em nha. Cám ơn nhiều.

      Source em đã chỉnh sửa như sau:
      Trong hàm button_Connect_Callback
      s.BytesAvailableFcnCount = 1;
      s.InputBufferSize =1;
      s.OutputBufferSize =1;
      s.BytesAvailableFcnMode = ‘byte’;
      Trong hàm BytesAvailable_Callback
      ind=fread(obj,1,’uint8′);
      kqua=num2str(ind);
      set(hand.edit_RX,’String’,kqua);
      Trong hàm button_Send_Callback
      %fprintf(s,strTX);
      fwrite(s,numsend,’int8′);

      Reply
    • Minh Tâm November 22, 2008, 7:39 am

      Đã sửa được rồi. Vui quá.

      Reply
    • huuthang November 23, 2008, 8:36 pm

      Chào bạn! Mình đang làm bộ chuyển đổi UART sang Ethernet. mình đang thử trên KIT C8051f120 của Silabs. Con giao tiếp Ethernet là CP2200. Mình đang có vướng mắc là làm sao để tính toán Buffer tối ưu nhất.

      Reply
    • ntkduy January 2, 2009, 9:25 am

      Thanks! em đang làm đồ án điều khiển thiết bị qua điện thoại và điều khiển bằng PC giao tiếp qua RS232 anh có thể góp ý cho em về Matlab không

      Reply
    • ntkduy January 5, 2009, 8:58 am

      Em muốn điều khiển thiết bị qua line điện thoại, bên phía phát em sử dụng máy tính giao tiếp với VĐK, nhờ VĐK từ dữ liệu nhận được từ cổng Serial chuyển thành tín hiệu điều khiển MT8888 phát ra số điện thoại cũng như là tín hiệu điều khiển.
      Em rất mong muốn phần mềm được dùng để thực hiện việc giao tiếp giữa máy tính và VĐK là Matlab nhưng em thấy nó thật sự khó quá. Mong anh cho em ít gợi ý.
      Cho em hỏi nữa là làm sao VĐK nhận tín hiệu từ Serial thì có thể chuyển thành mã BCD truyền cho MT8888. Đây là cái mà em thắc mắc nhất.
      Đọc xong anh thấy em biết rất ít về điện tử đúng không! Nhưng em đang tìm hiều. Mong anh giúp đỡ.
      Thân chào!

      Reply
    • phuong January 16, 2009, 9:13 am

      chào anh, em tên Phương, hiện em đang làm về cái board Altera Nios Kit. Em đang dùng thử cái code giao tiếp cổng COM do anh viết. cái đề tài của em la biến cái Kit đó thành một cái FIR filter. Em đã làm xong hardware và software lun rùi. Nhưng em ko bít làm sao cho giám khảo thấy đó là cái FIR filter. Em định dùng cổng COM để lấy cái input và cái output của nó ra. Rùi sau đó so sánh với nhau. Nhưng em đang bí, ko bít làm sao lấy nó ra được.

      anh có thể cho em một số hướng dẫn ko?
      Thanks

      Reply
    • lekhanh February 28, 2009, 2:15 pm

      Chào anh!Anh cho em hỏi phần mềm RS232 Communication của anh có thể gửi file dữ liệu được không ạ?Nếu giao tiếp 2 máy tính qua modem thì có gì khác không? Em đang làm bài tập về phần này nên muốn hỏi anh chỉ dẫn.Rất mong được anh trả lời sớm

      Reply
      • ngohaibac March 1, 2009, 9:32 am

        Em muốn gửi file qua cái này thì làm thêm phần nữa thôi: Đọc file kiểu binary hay bình thường, rồi send từng byte dữ liệu đi đến hết là xong mà em.

        Còn giao tiếp 2 máy tính qua Modem, em phải xem Modem gì ? Nếu bình thường thì nó là Ethernet đó, còn em nối = cổng COM thì lại khác. Em xem thêm về modem nhé, xem thông số có khác không. Anh nhớ là k khác khi dùng với RS232.

        Chúc em thành công.

        Reply
        • lekhanh March 5, 2009, 2:07 pm

          Cảm ơn anh ạ.ý em nói là modem vẫn hay dùng với cổng COM ạ.đúng là em chưa xem kỹ các thông số của modem.em sẽ về nghiên cứu kỹ lại.có gì khúc mắc em sẽ lại hỏi anh sau nhe!chào anh!

          Reply
        • lekhanh March 19, 2009, 6:01 pm

          Em dang chỉnh lại chương trình của anh để hoàn thành bài tập của em. 2 khó khăn ban đầu của em là:
          – Khi kiểm tra hoạt động của modem bằng lệnh AT, modem có xác nhận lại là OK.Nhưng khi em nối thẳng 2 modem với nhau không qua mạng điện thoại(2 modem đă được mối với máytính) thì khi gửi text,phần receiver chi nhận lại được kí tự mình gửi đi mà không nhận được của đối phương.Thử 1vài lệnh khác ,modem cũng đều đáp OK. Vậy lý do có thể tại sao vậy anh?
          – Em bổ sung thêm phần gửi file,bằng cách thêm vào button_selectdata và button_senddata. Em muốn khi ấn vào buttuon_selectdata thì sẽ mở ra1 hộp thoại chọn file(sử dụng lệnh uigetfile)
          Khi ấn button_senddata thì chương trình sẽ viết dữ liệu qua cổng comdưới dạng binary
          Chương trình em viết là:
          ———————————————————————————————————————————-
          function button_SelectData_Callback(hObject, eventdata, handles)
          % hObject handle to button_SelectData (see GCBO)
          % eventdata reserved – to be defined in a future version of MATLAB
          % handles structure with handles and user data (see GUIDATA)

          [filename, pathname] = uigetfile(‘*.*’, ‘Select One File’);
          if isequal(filename,0)|isequal(pathname,0)
          disp(‘File not found’)
          else
          SelectedFile = ([ pathname, filename,])
          handles.SelectedFile = SelectedFile;
          guidata(hObject,handles);
          end

          %% — Executes on button press in button_SendData.
          function button_SendData_Callback(hObject, eventdata, handles)
          % hObject handle to button_SendData (see GCBO)
          % eventdata reserved – to be defined in a future version of MATLAB
          % handles structure with handles and user data (see GUIDATA)

          IsConnect = handles.status_com;
          s = handles.com;
          SelectedFile = handles.SelectedFile;

          if (IsConnect == 1)
          set(handles.edit_StatusSend,’String’,’Sending… ‘);
          %SelectedFile = get_stringPopup(handles.SelectedFile);

          fid = fopen(‘SelectedFile’,’wb’);
          fwrite(s,fid,’bin’);
          set(handles.edit_StatusSend,’String’,’Sent successfully ‘);
          end

          handles.com = s;
          guidata(hObject,handles);
          —————————————————————————————————————————————————–
          Nhưng kết quả của việc viết dữ liệu không như ý muốn.
          À nhân tiện em hỏi anh luôn.Em muốn thêm vào cái giao diện của anh: mỗi chân DSR,CTS
          CD,RI sẽ có 1cái đèn.Trong khi giao tiếp,chân nào hoạt động thì đèn sẽ sáng.Anh có thể
          hướng dẫn cho em được ko.Vì em ko biết lam mấy cái đèn đó thế nào và viết hàm callback
          ra sao.hix
          Anh có thể giành chut thời gian xem hộ em được k?
          Cảm ơn anh trước nha!

          Reply
        • Phuc July 11, 2010, 12:04 pm

          Bác Bắc cho mình hỏi có gặp trường hợp thiết bị open trước khi mở máy tính xảy ra lỗi “Serial Port in use by another application” này không? Và cách khắc phục như thế nào?

          Reply
    • phamhuan March 4, 2009, 1:31 am

      chao anh! em đang chạy thử giao tiếp qua cổng com1 như vi dụ dơn gian anh hướng dẫn là dùng led để thử. Nhưng cứ đến hàm fprinft là báo lỗi.Do ko rành về matlab lắm nên em ko thể chạy được mà đèn thử cũng ko sáng.Mong anh giúp đỡ.Cám ơn!

      Reply
      • ngohaibac March 4, 2009, 8:13 am

        Chào em.

        Khái niệm “chạy” hay “không chạy” rất là general, em phải có kĩ năng debug khi một chương trình không chạy đúng theo tính toán, đó là một kĩ năng rất tốt để làm việc em ạ. Việc gì khó khăn cũng thế, em phải làm chắc chắn từng bước và test từng bước.

        Có lỗi gì đều nằm ở cửa sổ Command Window, em cứ gửi lên đây anh sẽ xem nhé.

        Chúc em thành công.

        Reply
        • Phuc July 11, 2010, 12:05 pm

          Bác Bắc cho mình hỏi có gặp trường hợp thiết bị open trước khi mở máy tính xảy ra lỗi “Serial Port in use by another application” này không? Và cách khắc phục như thế nào?
          Thank Bác nhiều.

          Reply
    • Pham Duy Khiem June 1, 2009, 11:32 pm

      anh bac co so dien thoai di dong hok.Cho em xin di,vi co nhieu van de ve matlab giao tiep voi may tinh can phai hoi truc tiep voi anh moi hieu duoc.

      Reply
      • ngohaibac June 2, 2009, 7:53 am

        Chào em. Số điện thoại của anh nè: +82-41-569-0205 Em cứ gọi thoải mái nhé, k thì vào http://diendan.hocdelam.org tham gia cũng được :)

        Chúc em thành công.

        Reply
    • pham quoc trung June 14, 2009, 5:47 pm

      anh bắc ơi cho em hỏi khi thực hiện nối chân 2 và 3 của cổng com lại rồi cho chạy như anh nói em nhận được thông báo sao anh xem giúp em với cảm ơn anh nhiều

      >> s = serial(‘COM1’)

      Serial Port Object : Serial-COM1

      Communication Settings
      Port: COM1
      BaudRate: 9600
      Terminator: ‘LF’

      Communication State
      Status: closed
      RecordStatus: off

      Read/Write State
      TransferStatus: idle
      BytesAvailable: 0
      ValuesReceived: 0
      ValuesSent: 0

      >> get(s)
      ByteOrder = littleEndian
      BytesAvailable = 0
      BytesAvailableFcn =
      BytesAvailableFcnCount = 48
      BytesAvailableFcnMode = terminator
      BytesToOutput = 0
      ErrorFcn =
      InputBufferSize = 512
      Name = Serial-COM1
      ObjectVisibility = on
      OutputBufferSize = 512
      OutputEmptyFcn =
      RecordDetail = compact
      RecordMode = overwrite
      RecordName = record.txt
      RecordStatus = off
      Status = closed
      Tag =
      Timeout = 10
      TimerFcn =
      TimerPeriod = 1
      TransferStatus = idle
      Type = serial
      UserData = []
      ValuesReceived = 0
      ValuesSent = 0

      SERIAL specific properties:
      BaudRate = 9600
      BreakInterruptFcn =
      DataBits = 8
      DataTerminalReady = on
      FlowControl = none
      Parity = none
      PinStatus = [1×1 struct]
      PinStatusFcn =
      Port = COM1
      ReadAsyncMode = continuous
      RequestToSend = on
      StopBits = 1
      Terminator = LF

      >> s.BytesAvailableFcn = @Serial_Callback;
      >> fopen(s);
      >> fprintf(s,”chao cac ban”);
      ??? fprintf(s,”chao cac ban”);
      |
      Error: Missing variable or function.

      Reply
      • ngohaibac June 14, 2009, 8:23 pm

        fprintf(s,”chao cac ban”); => Cái này sai rồi, trong Matlab xâu kí tự được bọc giữa dấu nháy ‘ chứ không phải “. Em thử lại: fprintf(s,’chao cac ban’);

        Reply
    • pham quoc trung June 14, 2009, 9:44 pm

      Em cảm ơn anh bắc em làm được rồi cho em hỏi thêm một câu nửa nhen nếu mình sử dụng Gui matlab giao tiếp với plc s7200 được không anh .Em đả làm đồ án về plc giao tiếp vb rồi giờ em muốn làm giao tiếp với matlab và có thêm phần xử lí ảnh nửa anh thấy có khả thi không và anh có thể gợi ý hướng đi được không anh hải bắc em cảm ơn anh

      Reply
    • Tuyển July 27, 2009, 3:47 am

      Em chào anh Hải Bắc.
      Những gì em tìm kiếm được phần nhiều em đều bắt gặp những bài gợi ý của anh trên các 4rum. Có một vấn đề em tìm mãi không được, em muốn nhờ anh giúp đỡ.
      Em muốn lập một cái GUI trên Matlab giao tiếp với cổng RS232. và nối với một mạch Vi xử lí (ở đây em xử dụng AVR) để để điều khiển ổn định giữ thăng bằng (sử dụng cảm biến góc nghiêng Gyro). Dự định của em là tín hiệu của cảm biến ngoài việc Xử lý điều khiển, nó sẽ được Vi điều khiển xử lý và gửi lên máy tính. Công việc của máy tính là vẽ được đồ thị biểu diễn khả năng và tốc độ ổn định. Để từ đó tìm được các giá trị các hàm Kp,Ki,Kd thích hợp. (Em đang học năm 2, những cái này là em tự mày mò và đi hỏi thầy ở trường chứ chưa được học, nên có chỗ nào sai về chuyên ngành xin anh bỏ qua).
      Em muốn nhờ anh chỉ điểm giúp em cách vẽ đồ thị trên GUI Matlab theo yêu cầu trên được không ạ?
      Anh gửi vào mail tuyen.hmi@gmail.com hoặc tuyenhmi@yahoo.com cho em nhé.

      Reply
      • ngohaibac July 31, 2009, 7:13 pm

        Chào em.

        Việc vẽ đồ thị trên GUI này rất đơn giản mà em. Em tìm trong website này, anh viết nhiều bài về cái này lắm rồi em ạ.

        Chúc em thành công.

        Reply
    • J October 20, 2009, 8:29 pm

      Các anh thật đáng nể .. giỏi thật .. :)

      Reply
    • duc hai November 7, 2009, 10:00 am

      Em đang làm cái đồ án cánh tay máy gắp vật có gắn camera xử lý ảnh bằng matlap cho tay máy hoạt động. trong đó cánh tay máy lập trình bằng PLC S7-200, xử lý ảnh bằng matlap, giao tiếp với máy tính bằng winCC plexible 2008. em chưa hướng được cách lập trình phần xử lý ảnh này và cách liên kết giữa PLC,wincc,và matlap. anh giúp em với. nếu có tài liệu hướng dẫn hay một vài bài mẫu anh gửi cho em nha. mail em nè: dnsonhai@gmail.com.
      cảm ơn anh nhiều!

      Reply
      • ngohaibac November 11, 2009, 12:09 pm

        chào em.

        Anh không khoái mảng PLC nên không tìm hiểu nhiều nên không có kiến thức về WinCC và mấy món kia lắm, nên không đưa ra lời khuyên cho em được.

        Chúc em thành công.

        Reply
    • Thành November 9, 2009, 10:00 am

      Chào Anh!
      Anh cho em hỏi
      Đang em làm luận văn về điều khiển thiết bị từ xa qua mạng GSM bằng cách nhắn tin tới sim trong modem GSM
      yêu cầu là kết hợp GSM và FPGA, một vi điều khiển AVR. Anh có thể chỉ dùm em hướng thực hiện được không ạ
      Cám ơn anh

      Reply
      • ngohaibac November 11, 2009, 12:08 pm

        Em có module GSM rồi thì cần gì FPGA làm gì nhỉ ? giao tiếp với module này chỉ cần RS232 và các lệnh với cú pháp cho sẵn rồi, cứ thế mà truyền đi thôi (AT, …).

        Chúc em thành công.

        Reply
        • Cao Thành November 12, 2009, 2:45 pm

          Vâng, cám ơn anh. Nhưng mà thầy Hướng Dẫn em bắt buộc phải có FPGA vào, do đó mới khó. Bây giờ em cần giao tiêp RS232 giữa FPGA Spartan 3E của Xilinx và AVR. Em đã thử viết nhiều lần rồi mà chưa được. Em phải làm sao?

          Reply
          • ngohaibac November 13, 2009, 11:51 am

            Cái này trong example của Xilinx có cái về tạo giao thức UART để giao tiếp mà. Em xem thí dụ có sử dụng PicoBlaze là xong.

            Chúc em thành công.

            Reply
            • Cao Thành December 8, 2009, 10:19 am

              anh có thể nói rõ hơn không, em tìm hoài chưa biết sử dụng. Anh có thể cho em xin ít tài liệu này không?
              Cám ơn anh nhiều…

              Reply
    • NgA November 11, 2009, 7:46 pm

      Em đọc đoạn code thấy có các khai báo:
      s.BytesAvailableFcn = @BytesAvailable_Callback;
      s.OutputEmptyFcn = @OutputEmpty_Callback;
      s.BreakInterruptFcn = @BreakInterrupt_Callback;
      s.ErrorFcn = @Error_Callback;
      s.PinStatusFcn = @PinStatus_Callback;
      s.BreakInterruptFcn = @BreakInterrupt_Callback;
      s.TimerFcn = @Timer_Callback;

      Có fải S. là cho biết khai báo cho Serial
      còn @ là sao vậy anh ??? Em help mãi trong Matlab mà chẳng tìm được tài liệu nói về nó …
      Xin cám ơn câu trả lời của anh

      Reply
      • ngohaibac November 12, 2009, 12:02 am

        Chào em.

        s là biến serial mà anh khai báo ở trước đó. Còn @ để lấy địa chỉ của hàm đó, cái này gọi là gán con trỏ hàm.

        Chúc em thành công.

        Reply
        • NgA November 13, 2009, 10:34 am

          em cũng đang tìm hiểu về cái modem GSM ..
          Hôm bữa thi truyền nhận được …
          nhưng mà MODEM truyền nhiều dòng lệnh .. còn trong MATLAB thì chỉ nhận từng dòng lệnh..
          Còn ở khung RX thì chỉ nhận đươc dòng lệnh cuối cùng …
          Khôgn giống như Hyper Terminal trong máy
          Nóbị j thế anh ??

          Reply
          • NgA November 13, 2009, 10:52 am

            Ah .. xin lỗi anh … để em cố xem lại … đag lúg túg wá .. 😀 .. chưa xem mà hỏi rồi .. 😀 ..

            Reply
            • ngohaibac November 13, 2009, 11:53 am

              Cố gắng lên em.

              Chúc em thành công.

              Reply
              • NgA November 16, 2009, 10:32 pm

                Trời đất .. hxhx .. tự nhiên giờ cái MATLAB không nhận chuỗi RX về luôn rồi anh ơi gửi đi thì vẫn gửi ào ào (vì khi em disconnect ở matlab .. nhảy wa Hyper Connect thi vẫn nhận đc đầy đủ kết quả và chuỗi trả về ??
                giao tiếp Hyper terminal thì vẫn bình thường ??
                Nó bị gì thế anh ??

                Reply
                • ngohaibac November 17, 2009, 7:33 pm

                  Chào em.

                  Cái đó lâu lâu rồi anh không dùng lại, không biết lỗi gì nhỉ. Em có để ý, khi gửi về Matlab thì gửi thêm các kí tự xuống dòng không em ?

                  Chúc em thành công.

                  Reply
                  • NgA November 17, 2009, 9:03 pm

                    Không anh ơi .. chẳng có j trong khung RX cả .. giốg như là k nhận được chuỗi trả về ấy .. còn khi giao tiếp với MODEM GSM thì bình thường ah ..
                    hx

                    Reply
    • NgA November 13, 2009, 9:24 am

      Thanks anh
      Có j em làm fiền anh típ .. 😀 .. em đag làm về cái này …
      sinh viên gà wá anh àh .. hx

      Reply
    • NgA November 24, 2009, 9:34 pm

      hxhx … Qua mấy ngày lui cui lui cui mò mẫm thì cũng đã tìm ra cái lỗi của con MODEM nhà em rồi ..
      Cám ơn anh nhiều nha .. 😀
      Ah … mà nhân tiện anh cho em hỏi cái … 😀
      Em đag muốn đọc dữ liệu từ trong SIM (không phải những dữ liệu quan trọng .. mà chỉ là những tin nhắn SMS thôi) .. Cái này thì thiết bị ngoài chợ trời bán đầy anh àh .. 😀
      Nhưgn em đag thắc mắc là liệu mình có thể dùng 1 cái mạch j đó để đọc SMS .. và giao tiếp với matlab qua cổng COM được không ??
      Anh có từng nghe nói về cái này chưa anh ???
      Nếu có thì send em 1 vài tài liệu với nha .. ;p
      Cám ơn anh

      Reply
    • dang thanh khen November 27, 2009, 11:02 am

      em muon mo phong truyen nhan chuan rs232 bang matlab simulink nhung em chua biet cach viet thu nhan start bit sotp bit cac anh chi gium em . thank so much

      Reply
    • dang thanh khen November 27, 2009, 6:25 pm

      anh hai oi em mo phong chuan rs232 dong bo bit ko duoc anh huong dan giup em nha! thank you so much

      Reply
    • NgA December 3, 2009, 9:16 pm

      Anh ơi … có thể giúp e 1 cái nữa được không ??
      Em đag muốn quét chuỗi trong khung nhận RX thì phải làm sao anh ??
      Ví dụ như chuỗi RX nhận được là ‘OK’ thì chương trìh sẽ tự động gửi thêm 1 chuỗi yêu cầu khác đó anh ??
      mấy cái liên kết rối rem quá .. em làm mấy hôm nay mà chẳng được
      Cám ơn anh

      Reply
    • Any December 8, 2009, 1:17 am

      anh oi,e dang lam bai tap dung con 89c51 giao tiep voi may tinh de dieu khien do sang cua led thong wa viec dieu khien do rong xung,vd nhu co 10 muc(0-9).moi lan bam mot phim bat ky tu 0-9 thi do sang cua led se sang khac nhau.thay keu bon e dung VB viet giao dien nhung e chi moi tim hieu thui nen ko bit viet code sao nua.a co the chi e vai chieu dc ko?
      thank a nhiu lam

      Reply
    • NgA December 19, 2009, 6:01 pm

      hxhx … anh B bỏ cái Topic này lun rồi .. :)

      Reply
    • quynh December 26, 2009, 10:23 am

      Chào anh, em đã tải chương trình mẫu của anh, và cho chạy thử. Em dùng chương trình Virtual sẻial port driver 6.9 để tạo 2 cổng com ảo 1 và 2 kết nối với nhau. Chương trình mẫu của anh em cho kết nối với com1, chương trình terminal em cho kết nối với com 2. khi thực hiện chuyển dữ liệu thử thì thấy bên chương trình của anh gửi dữ liệu đi được, trong khi phần nhận thì không thể hiện được( gửi từ chương trình tẻminal về chương trình của anh không nhận được, mặc dù ở 2 cổng com ảo vẫn thấy lượng bytes gửi và nhận). Em cũng có thắc mắc là: trong đoạn function BytesAvailable_Callback(obj,event) anh có ghi:

      global hand;
      ind = fscanf(obj);
      save data;
      % Edit code here – Ngo Hai Bac
      str = get(hand.edit_RX,’String’)
      temp = sprintf(‘%s\n%s\n’,ind, str)
      set(hand.edit_RX,’String’,ind);

      thì nhiệm vụ của cái temp đó là gì. Thanks anh

      Reply
      • ngohaibac December 26, 2009, 3:03 pm

        Cái temp đó chỉ là format lại cái string theo đúng ý và hiển thị lên edit text mà thôi, chẳng có gì cả.

        Lưu ý, các chương trình khác gửi vào Matlab thì nhớ send ký tự xuống dòng CR/LF thì nó mới nhận dc, kiểu như là terminal char vậy.

        Chúc em thành công.

        Reply
        • Quynh December 28, 2009, 10:42 pm

          Thanks anh rất nhiều, có đọc qua mấy cái comment của những tiền bối, tuy nhiên không biết về vụ kí tự xuống hàng này, giờ đã thực hiện được. Cảm ơn anh.
          À, vẫn còn một chỗ thắc mắc. Cái temp thì vẫn biết là chuyển đổi dạng dữ liệu, tuy nhiên phần set(…) em thấy là set cái ind chứ đâu phải là set cái temp, có phải là dư phần này hoặc em hiểu sai ở đâu mong anh chỉ giáo

          Reply
    • lenguyenngoclam March 30, 2010, 6:39 am

      Chào anh.
      Em nối tắt chân 2 và chân 3 của cổng COM lại rồi nhập đoạn chương trình sau:
      s = serial(‘COM1’);
      fopen(s);
      fprintf(s, ‘chao’)
      nhan = fscanf(s);
      Nó báo lỗi: Warning: A timeout occurred before the read operation completed.
      Vậy cho em hỏi làm sao khác phục lỗi này?

      Reply
      • ngohaibac March 30, 2010, 11:34 am

        Em nên viết một hàm Callback cho cổng COM này nhé, như thế thì khi có byte nhận được về từ cổng COM thì em sẽ biết được, còn em gõ thế kia thì sao mà nhận được, khi gõ xong thì các byte đó đã nhận dc từ lâu rồi còn đâu, thì em đợi làm gì có gì :D.

        Em đọc lại bài viết của anh đi nhé.

        Reply
        • phulanchi April 1, 2010, 10:57 am

          Viết hàm Callback cho cổng COM này như thế nào ạ? Dùng để làm gì ạ? Mong anh chỉ giáo!

          Reply
          • ngohaibac April 2, 2010, 8:56 am

            Viết hàm Callback chính là một dạng viết hàm xử lý ngắt. Chương trình này sẽ xử lý dữ liệu khi dữ liệu gửi tới cổng COM. Nếu không có chương trình ngắt này, em phải dùng phương pháp khác, đó là: hỏi dò (polling) để liên tục đọc ở cổng COM đó xem có dữ liệu chuyển đến hay không.

            Chúc em thành công.

            Reply
    • phulanchi March 30, 2010, 1:45 pm

      Chào anh,
      em đã đọc các bài của anh, anh viết rất hay.
      Em cũng mới học MATLAB. Lập trình GUI em đã lam được việc đọc dữ liệu từ file Excel để vẽ 1 đồ thị.

      Truyền dữ liệu từ MATLAB xuống VĐK thì OK (trong CodevisionAVR dùng 1 hàm getchar và putchar), nhưng để nhận giá trị từ VĐK lên MATLAB thì chưa thể được, ví dụ như muốn VĐK gửi lên giá trị 26 thì phải làm thế nào để gửi và nhận được.

      Cảm ơn anh rất nhiều!

      Reply
      • ngohaibac March 30, 2010, 4:57 pm

        Em gửi thêm kí tự kết thúc chuỗi cho xâu kí tự của em là được. Ký tự: CR, LF đó em. Xem thêm trong bảng mã ASCII xem nhé.

        Chúc em thành công.

        Reply
        • Quang April 7, 2010, 12:19 am

          Anh ơi, thế trong bài có đoạn code là
          s.ReadAsyncMode = ‘continuous’;

          s.BytesAvailableFcnCount = 1;

          s.Terminator = ‘CR’
          s.BytesAvailableFcnMode = ‘terminator’;%’terminator’;
          Em sửa lại thành
          s.ReadAsyncMode = ‘continuous’;

          s.BytesAvailableFcnCount = 1;

          s.Terminator = ”
          s.BytesAvailableFcnMode = ‘terminator’;%’terminator’;
          Thì như vậy chương trình chạy có còn đúng không ạ. Như thế thì em thấy nó không gửi CR hay LF xuống slave nữa. Nhưng em chưa thử nếu gửi từ slave lên thì nó có hiện không? Anh giúp em với!
          Thanks!

          Reply
          • ngohaibac April 7, 2010, 2:20 am

            Cái này anh chưa test, em test thử rồi thông báo lên đây nhé. Nghiên cứu là phải thử nghiệm mà 😀

            Chúc em thành công.

            Reply
            • Quangvh April 7, 2010, 12:14 pm

              cái này em tìm ra cách khắc phúc rồi.
              Với giao thức lệnh gửi xuống stop byte là ‘!’ và lệnh gửi lên stopbyte là ‘*’ thì ta làm như sau:

              lúc kết nối COM. thiết lập s.terminator = ‘*’; (hay ‘CR’ hay gì đó hoặc cũng có thể không khởi tạo cũng được. Nhưng nên đặt là * để ta có thể nhận dữ liệu từ COM trước khi gửi dữ liệu)

              Đến hàm function button_Send_Callback(hObject, eventdata, handles) thì ta thêm vào:
              + Sau dòng code: if (IsConnect == 1) dòng sau.
              s.terminator = ‘!’;
              + Và trên dòng end % end của function button_Sen_Callback(…, …, …) dòng:
              s.terminator = ‘*’;

              Đó là mẹo vặt của em vọc cái cái của anh và biến nó sang thành RS485.

              Reply
              • ngohaibac April 7, 2010, 2:29 pm

                Chúc mừng em nhé. Em giỏi quá :)

                Reply
                • Quangvh April 7, 2010, 4:12 pm

                  Có gì sai trong đó à anh? Anh chỉ cho em với!

                  Reply
    • lenguyenngoclam April 4, 2010, 9:27 pm

      Em mua 1 cổng DB9 cái rồi nối tắt chân 2 và 3 của nó với nhau. Sau đó em gắn cổng này vào máy tính.
      Em viết hàm callback như sau:
      function Serial_Callback(obj,event)
      ind = fscanf(obj)
      Sau đó em lưu file với tên Serial_Callback.m vào thư mục Current Directory của Matlab.
      Em nhập các dòng lệnh sau:
      >> s = serial(‘COM1′)
      >> get(s)
      >> s.BytesAvailableFcn =@Serial_Callback;
      >> get(s)
      Em thấy thông số BytesAvailableFcn là:
      BytesAvailableFcn = [1×1 function_handle]
      Em nhập tiếp:
      >> fopen(s)
      >> fprintf(s,’chao cac ban’);
      Nhưng tạo sao em không thấy được string nhận được. Em chỉ thấy dòng sau hiện ra:
      >>

      Reply
      • ngohaibac April 5, 2010, 10:28 pm

        Em thử load cái chương trình anh tạo ở trong bài viết đó về test xem. nếu không được thì tức là cổng COM của em có vấn đề. Hoặc là dùng Hyper terminal test xem nhé.

        Chúc em thành công.

        Reply
    • Quangvh April 6, 2010, 9:13 pm

      Anh Bắc à, cái chương trình của anh làm sao cái receiver không nhận vậy.
      Em gắn vào 1 slave. Gửi xuống đó chuỗi @123! và nếu dùng hyperterminal thì nhận được #123! nhưng dùng chương trình của anh thì lại không nhận được gì cả là sao vậy ạ!

      Reply
    • Quangvh April 6, 2010, 9:24 pm

      Thế cho em hỏi trong cái thiết lập terminator.
      Code ban đầu là ‘CR’ => khi gửi data lên phải có thêm kí tự xuống dòng đúng không ạ
      Vậy thì cần sửa như thế nào để không cần phải thêm kí tự xuống dòng ạ.

      Reply
      • ngohaibac April 7, 2010, 2:05 am

        Do serial object là đối tượng định nghĩa sẵn trong Matlab rồi em, nên luôn cần phải có kí tự Terminator, là kí tự kết thúc phiên truyền thôi. Em làm quen thì sẽ thấy nó rất hiệu quả, và trong rất nhiều cách thực hiện ng ta vẫn làm như thế. A nghĩ là Matlab sử dụng hàm fgets hay tương tự thế để thao tác với dữ liệu này rồi :)

        Chúc em thành công.

        Reply
    • Thanhnt April 27, 2010, 4:30 pm

      Anh Bắc ơi cho em hỏi chút. Trong Matlab có câu lệnh nào
      + xóa bộ nhớ đệm nhận từ slave không ạ. Em giao tiếp với slave nhưng slave gửi chưa đủ xâu thì bị ngắt ngoài, lần sau gửi nó sẽ đưa hết những cái trước ra. Nên em hỏi cách xóa bộ nhớ đệm.
      + Anh có cách nào delay thời gian là 10ms trong matlab không ạ.

      Reply
    • toinhatminh August 9, 2010, 11:34 pm

      Chào annh Bắc,
      Bạn của em vừa rồi làm đề tài tốt nghiệp xong , khi bạn nhấn nút trên gui để lấy dữ liệu từ mạch vi điều khiển bên ngoài(lấy nhiệt độ từ cảm biến) ,sao em thấy chậm quá, mất tới 10s, trong một thời điểm chỉ có lấy được 1 tín hiệu cảm biến à, tụi em muốn là khi nhân một nút trên gui,nhận về 10 cảm biến, hiển thị trên text box. Anh Bắc co cách truyen nao nhanh va lam một lúc không chỉ cho tụi em với, cảm ơn anh Bắc nhiều
      Chúc anh sức khỏe và thành công

      Reply
    • thong November 28, 2010, 10:20 am

      chao ah . em dag lam de tai ve led ma tran giao tiep may tinh bang visual basic. ah co the chi dan em hoac cho em tai lieu khog

      Reply
    • quan March 13, 2011, 3:13 am

      Anh ơi cho em hỏi
      sao bài của Anh em gỏ y chan mà nó cứ báo lổi ở chổ State
      dòng Read/Write State
      Anh có file matlab bài ví dụ mà anh trình bày ở trên không cho em xin.
      em mới làm quen matlab nên gỏ theo mà nó cứ báo lổi nhìu quá em không bít sữa làm sao.
      em Đang làm giao tiếp Matlab với con vi sử lý AVR atmega32. anh có tài liệu gì liên quan thì cho em xin nha.
      ở trên có ban hỏi về avr giống em mà chưa thấy Anh trả lời

      em cám ơn Anh nhiều.

      Reply
    • Lưu February 28, 2012, 8:50 pm

      anh có phấn mô phỏng proutues thì post dùm e với a :)

      Reply
    • chỉnh October 8, 2012, 12:14 pm

      anh Bắc cho em hỏi.
      Cách khai báo cổng COM ảo trong Matlab như thế nào ạ.?
      Thanks anh nhiều.

      Reply
      • ngohaibac January 4, 2013, 10:41 pm

        COM ảo với COM thật thì khai báo k khác gì nhau cả :D, do OS quyết định mà, phía user hay ứng dụng Matlab thì như nhau thôi.

        Reply
    • Thiện February 27, 2013, 11:51 am

      Anh cho em hỏi chút. Em có mô hình như sau:
      Serial Devices —> modem GPRS (2 cái này kết nối với nhau thông qua cổng kết nối RS232). tiếp theo mình có một con server(PC) kết nối internet. modem kết nối với server thông qua mạng GPRS.
      Em cần giao tiếp với thiết bị serial devices từ con server. Trong quá trình giao tiếp em cần thay đổi thông số cấu hình cổng COM ví dụ như Data bits mà ko Disconnect thiết bị, thì em phải làm như thế nào ạ?
      Thanks anh1

      Reply
    • ly quoc anh October 22, 2013, 10:40 am

      Chào Anh!
      em có vấn đề muốn hỏi anh là em sử dụng card dsp giao tiếp với matlab, em muốn đọc xung encoder từ ngỏ ngắt của card này trên matlab, em phải lập trình m-file về khai báo phần cứng và đếm xung encoder như thế nào anh?

      Reply
    • Khoa March 21, 2015, 9:40 am

      A cho e hỏi, e muốn điều khiển động cơ bước chạy half step và full step co delay, qua RS232, code pic 16gf877a thì có rồi nhưng còn đk đc bằng matlab thì e không biết viết như thế nào, a hướng dẫn giúp e,

      Reply
    • Nguyen Vu Linh May 11, 2015, 11:11 am

      chào anh,
      em có làm đề tài điều khiển động cơ dùng DSP và Encoder và nhận dữ liệu gửi về qua cổng COM dùng Terminal để xem. lúc chưa cấp nguồn động cơ thì giá trị Encoder được gửi về, nhưng khi cấp nguồn thì nó báo lổi không gửi dữ liệu về được do chức năng viết dữ liệu trả về bị lỗi. anh có biết do lỗi gì k anh?
      cám ơn anh

      Reply

    Leave a Comment