Ví dụ như em tạo ra 3 Button trên GUIThì nó tương đượng vậy đó ;)).. Gửi 1 ký tự hay 1 dãy ký tự lên máy tính rồi GUI sẽ nhận biết mà thực hiện lệnh tương ứng ^^, tương vự cho việc ngược lại
 (BT1,BT2,BT3)
(BT1,BT2,BT3)
Anh có thể cho em một code ví dụ không anhVí dụ như sự kiện click chuột của button 1 là đưa vô cổng Com ký tự "A" thì MCU đọc về giá trị "A" thì nó thực hiện chức năng được mình gán là "A" như là bật tắt led chẳng hạn



Theo mình thì nên cho cái code lúc nhận nút bấm bên reiceiver để mọi người ai biết thì giúp đỡAnh có thể cho em một code ví dụ không anhVí dụ như sự kiện click chuột của button 1 là đưa vô cổng Com ký tự "A" thì MCU đọc về giá trị "A" thì nó thực hiện chức năng được mình gán là "A" như là bật tắt led chẳng hạn
Em lấy cái code UART 96000 Echo lại ký tự mình nhập trong sample code đó anh, GUI thì em làm lại y channg như TUT này:
Không hiểu sao khi em nhấn Send lần đầu tiên thì bên Receive echo lại , nhấn lần nữa thì nó không echo lại nữa, phải rút cáp cắm lại nó mới echo mà cũng echo 1 lần thôi là sao anh???
 ....
....code em viết lại giống cái TUT ở trên đó anh !! Không hiểu sao nó lại bị như vậy nữa??Theo mình thì nên cho cái code lúc nhận nút bấm bên reiceiver để mọi người ai biết thì giúp đỡ....
 mọi ngươi xem giúp em thử nó lỗi chỗ nào ạ?
mọi ngươi xem giúp em thử nó lỗi chỗ nào ạ?
 
	using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int intlen = 0;// So cong COM ket noi vao may tinh
        private void timer1_Tick(object sender, EventArgs e)
        {   
            
            string[] ports = SerialPort.GetPortNames();//Lay All COM noi vao PC
            if (intlen != ports.Length)
            {
                intlen = ports.Length;
                cbb_Select_Com.Items.Clear();
                for (int i = 0; i < intlen; i++)
                {
                    cbb_Select_Com.Items.Add(ports[i]);
 
                }
            }
        }
 
        private void bt_Connect_Click(object sender, EventArgs e)
        {
            if (lb_Status.Text == "Disconnected")
            {
                Com.PortName = cbb_Select_Com.Text;
                Com.Open();
                lb_Status.Text = "Connected";
                bt_Connect.Text = "Disconnected";
            }
            else
            {
                Com.Close();
                lb_Status.Text = "Disconnected";
                bt_Connect.Text = "Connected";
 
            }
        }
 
        private void bt_Send_Data_Click(object sender, EventArgs e)
        {
            string s;
            if (lb_Status.Text == "Connected") //Neu Co Ket Noi COM
            {
                s = txt_Send_Data.Text;  //Gan Du Lieu vao Bien S
                Com.WriteLine(s);
                
            }
 
        }
 
        private void OnCom(object sender, SerialDataReceivedEventArgs e)
        {
            //Doc 1 byte se ngat COM
            string s;
            s = Com.ReadExisting(); //Doc tat ca du lieu trong Buff cua cong COM
            //txt_Receive_Data.Text = s;
           Display(s);
        }
        private delegate void DLDisplay(string s);
        private void Display(string s) 
        {
            if (txt_Receive_Data.InvokeRequired)
            {
                DLDisplay sd = new DLDisplay(Display);
                txt_Receive_Data.Invoke(sd, new object[] { s });
            }
            else 
            {
                txt_Receive_Data.Text = s;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            Close();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void txt_Receive_Data_TextChanged(object sender, EventArgs e)
        {
 
        }
    }
}Code em nạp xuống MCU nè anh !! Code mẫu của TI màÝ mình nói là bên MCU =.=.. hiz..chứ nếu viết giống trong TUT thì không sao au

#include <msp430g2553.h>
 
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  if (CALBC1_1MHZ==0xFF)// If calibration constant erased
  {
    while(1);                               // do not load, trap CPU!!
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
 
  __bis_SR_register( GIE);       // Enter LPM0, interrupts enabled
}
 
//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}Em thử dung cấu trúc trong ngắt nhận như sau:Anh có thể cho em một code ví dụ không anhVí dụ như sự kiện click chuột của button 1 là đưa vô cổng Com ký tự "A" thì MCU đọc về giá trị "A" thì nó thực hiện chức năng được mình gán là "A" như là bật tắt led chẳng hạn
Em lấy cái code UART 96000 Echo lại ký tự mình nhập trong sample code đó anh, GUI thì em làm lại y channg như TUT này:
Không hiểu sao khi em nhấn Send lần đầu tiên thì bên Receive echo lại , nhấn lần nữa thì nó không echo lại nữa, phải rút cáp cắm lại nó mới echo mà cũng echo 1 lần thôi là sao anh???
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  
while (!(UCA0IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
    switch(UCA0RXBUF)
    {
    case 'A':   // 'A' mở thiết bị
       {
        // công việc 
          break;
       }  
        case 'B':  // đóng thiết bị
      {
  // công việc
                 break;
      }
      default: break;
    }
}Cái A, B là mình gửi từ GUI hả anh??? Vậy code trên GUI có thay đổi gì không anh hay giữ nguyên như TUT ạ/?Em thử dung cấu trúc trong ngắt nhận như sau:
Code:#pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready? switch(UCA0RXBUF) { case 'A': // 'A' mở thiết bị { // công việc break; } case 'B': // đóng thiết bị { // công việc break; } default: break; } }

