Friday_yy 2020-08-04 11:59 采纳率: 0%
浏览 148

指定的函数与委托类型不匹配(出错的地方是 //定义DataReceived事件,当串口收到数据后触发事件)

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO::Ports;
using namespace System::Linq;
using namespace System::Text;
using namespace System::Threading;

namespace serial_communication
{

/// <summary>
/// Form1 摘要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
        SerialPort sp ;
        bool isOpen ;
        bool isSetProperty ;
         bool isHex ;

public: delegate void Mycallback(String^ str);

public:
    Form1(void)
    {
        InitializeComponent();
        //
        //TODO: 在此处添加构造函数代码
        //
    }

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
this->MaximizeBox = false;
this->MaximumSize = this->Size;
this->MinimumSize = this->Size;

         for (int i = 0; i < 10; i++)    //最大支持10个串口,可根据自己需求增加
        { 
            cbxCOMPort->Items->Add("COM"+(i+1).ToString());
        }
         cbxCOMPort->SelectedIndex = 0;


        //列出常用的波特率
        cbxBaudRate->Items->Add("1200");
        cbxBaudRate->Items->Add("2400");
        cbxBaudRate->Items->Add("4800");
        cbxBaudRate->Items->Add("9600");
        cbxBaudRate->Items->Add("19200");
        cbxBaudRate->Items->Add("38400");
        cbxBaudRate->Items->Add("115200");
        cbxBaudRate->SelectedIndex = 5;

        //列出停止位
        cbxStopBits->Items->Add("0");
        cbxStopBits->Items->Add("1");
        cbxStopBits->Items->Add("1.5");
        cbxStopBits->Items->Add("2");
        cbxStopBits->SelectedIndex = 1;

        //列出数据位
        cbxDataBits->Items->Add("8");
        cbxDataBits->Items->Add("7");
        cbxDataBits->Items->Add("6");
        cbxDataBits->Items->Add("5");
        cbxDataBits->SelectedIndex = 0;

        //列出奇偶校验位
        cbxParity->Items->Add("无");
        cbxParity->Items->Add("奇校验");
        cbxParity->Items->Add("偶校验");
        cbxParity->SelectedIndex = 0;

        //默认为char显示
        rbnChar->Checked = true; 
     }

private: System::Void btnCheckCom_Click(System::Object^ sender, System::EventArgs^ e)
{
bool comExistence = false; //有可用串口标志位
cbxCOMPort->Items->Clear(); //清除当前串口号中的所有串口名称
for (int i = 0; i < 10; i++)
{
try
{
sp.PortName = ("COM" + (i + 1).ToString()); //可能有问题
sp.Open();
sp.Close();
cbxCOMPort->Items->Add("COM" + (i + 1).ToString());
comExistence = true;
throw 1;
}
catch(int& value)
{
continue;
}
}
if (comExistence)
{
cbxCOMPort->SelectedIndex = 0;
}
else
{
MessageBox::Show("没有找到可用的串口!", "错误提示");
}
}

private :bool CheckPortSetting()    //检查串口是否设置
    {
        if (cbxCOMPort->Text->Trim() == "") return false;
        if (cbxBaudRate->Text->Trim() == "") return false;
        if (cbxDataBits->Text->Trim() == "") return false;
        if (cbxParity->Text->Trim() == "") return false;
        if (cbxStopBits->Text->Trim() == "") return false;
        return true;
    }

private: bool CheckSendData() //检查发送数据是否输入
{
if (tbxSendData->Text->Trim() == "") return false;
return true;
}

private: void SetPortProperty() //设置串口的属性
{
// sp = gcnew SerialPort();
sp.PortName = cbxCOMPort->Text->Trim(); //设置串口名
sp.BaudRate = Int32::Parse (cbxBaudRate->Text->Trim()); //设置串口的波特率

        if (cbxStopBits->Text->Trim() == "0")    //设置停止位
        {
            sp.StopBits = StopBits::None;
        }
        else if (cbxStopBits->Text->Trim() == "1.5")
        {
            sp.StopBits = StopBits::OnePointFive;
        }
        else if (cbxStopBits->Text->Trim() == "2")
        {
            sp.StopBits = StopBits::Two;
        }
        else 
        {
            sp.StopBits = StopBits::One;
        }

        sp.DataBits = Int32::Parse(cbxDataBits->Text->Trim());    //设置数据位

        if (cbxParity->Text->Trim() == "奇校验")    //设置校验
        {
            sp.Parity = Parity::Odd;
        }
        else if (cbxParity->Text->Trim() == "偶校验")
        {
            sp.Parity = Parity::Even;
        }
        else
        {
            sp.Parity = Parity::None;
        }

        sp.ReadTimeout = -1;    //设置超时读取时间
        sp.RtsEnable = true;

        //定义DataReceived事件,当串口收到数据后触发事件 
        //sp.DataReceived += gcnew SerialDataReceivedEventHandler(sp,&serial_communication::Form1::sp_DataReceived);
        Mycallback^ SerialDataReceivedEventHandler = gcnew Mycallback(&serial_communication::Form1::sp_DataReceived);
         SerialPort^ sp = gcnew SerialPort("COM1");
          SerialDataReceivedEventHandler += gcnew Mycallback( sp,&serial_communication::Form1::sp_DataReceived);
          //mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        if (rbnHex->Checked)
        {
            isHex = true;
        }
        else
        {
            isHex = false;
        }
    }

private: void btnOpenCom_Click(Object^ sender, EventArgs^ e) //打开串口,btnopencom点击处理函数
{
if (isOpen == false)
{
if (!CheckPortSetting()) //检测串口设置
{
MessageBox::Show("串口未设置,错误提示");
return;
}
if (!isSetProperty)
{
SetPortProperty();
isSetProperty = true;
}
try
{
sp.Open();
isOpen = true;
btnOpenCom->Text = "关闭串口";
//串口打开后,相关的串口设置按钮不可再用
cbxCOMPort->Enabled = false;
cbxBaudRate->Enabled = false;
cbxDataBits->Enabled = false;
cbxStopBits->Enabled = false;
cbxParity->Enabled = false;
rbnChar->Enabled = false;
rbnHex->Enabled = false;
throw 1;
}
catch(int& value)
{
//打开串口失败后,相应标志位取消
//isSetProperty = false;
// isOpen = false;
// MessageBox::Show("串口无效或已被占用", "错误提示");
}
}
else
{
try
{
sp.Close();
isOpen = false;
isSetProperty = false;
btnOpenCom->Text = "打开串口";
//关闭串口后,串口设置选项可以继续使用
cbxCOMPort->Enabled = true;
cbxBaudRate->Enabled = true;
cbxDataBits->Enabled = true;
cbxStopBits->Enabled = true;
cbxParity->Enabled = true;
rbnChar->Enabled = true;
rbnHex->Enabled = true;
throw 1;
}
catch(int& value)
{
// MessageBox.Show("关闭串口时发生错误", "错误提示");
}
}
}

private: void btnSendData_Click(Object^ sender, EventArgs^ e) //发送数据,btnsenddata点击处理函数
{
if (isOpen)
{
try
{
sp.WriteLine(tbxSendData->Text);
throw 1;
}
catch(int& value)
{
//MessageBox::Show("发送数据时发生错误!", "错误提示");
//return;
}
}
else
{
MessageBox::Show("串口未打开", "错误提示");
return;
}
if (!CheckSendData())
{
MessageBox::Show("请输入要发送的数据!", "错误提示");
return;
}
}

private: void sp_DataReceived(Object^ sender, SerialDataReceivedEventArgs^ e) /////////
{

        System::Threading::Thread::Sleep(100);    //延时100ms等待接收完数据
        //this.Invoke就是跨线程访问ui的方法,也是文本的范例


            if (isHex == false)
            {
                tbxRecvData->Text += sp.ReadLine();
            }
            else
            {
                array<String^>^ ReceivedData = gcnew array<String^> (sp.BytesToRead);
               // sp.Read(ReceivedData, 0, ReceivedData->Length);
                String^ RecvDataText = nullptr;
                RecvDataText = sp.ReadExisting();
                for (int i = 0; i < ReceivedData->Length; i++)
                {
                    RecvDataText += ( ReceivedData[i] + " ");
                }
                tbxRecvData->Text += RecvDataText;
            }
            sp.DiscardInBuffer();

    }

private: void btnClearData_Click(Object^ sender, EventArgs^ e)
{
tbxRecvData->Text = "";
tbxSendData->Text = "";
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-08-04 15:44
    关注

    private: void sp_DataReceived(Object sender, SerialDataReceivedEventArgs e)
    ->:
    private: void sp_DataReceived(Object^ sender, SerialDataReceivedEventArgs^ e)

    你要传入SerialPort而不是窗体。

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗