65.9K
CodeProject 正在变化。 阅读更多。
Home

FT857D Manager 火腿无线电控制器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2016年3月22日

CPOL

4分钟阅读

viewsIcon

17614

downloadIcon

440

更改频率、模式并在无线电上发送莫尔斯电码

引言

该代码通过 CAT 电缆连接到业余无线电,并更改无线电上的频率和模式。它还通过连接到无线电 CW 键控杆的电缆(来自 USB 转串口)以及两个电阻器和一个 NPN 晶体管发送 CW(莫尔斯电码)。因此,它使用无线电自身的音频设备,并且不使用声卡发送莫尔斯电码。

背景

这个想法是创建一个由计算机控制的无线电控制器,并学习如何使用 CAT 命令。因此,该项目的第一部分是创建一个程序,该程序可以在屏幕上更改频率,然后连接到无线电,以便可以使用 CAT 命令通过按下 Windows 应用程序中的按钮来更改无线电上的频率和模式(LSB、USB、CW)。所以我开始编写软件并订购了 CAT 电缆和 USB 转 USB 电缆。当电缆到货时,我完成了该程序的 1.0 版本。之后,我面临着制作 CW(莫尔斯电码)发送部分的挑战。我订购了新的电缆并进行了一些测试,并编写了应用程序的 CW 部分代码。

Using the Code

代码分为三个部分构建。一个 Windows 项目和两个类库。第一个类库称为 ft857d,它控制与无线电的 CAT 连接。第二个类库称为 ft857dcw,它控制向无线电发送 cw。

CAT 控制器中这部分代码用于更改无线电上的频率。它从八个文本框中获取一个字符串(频率,例如 14MHz 的“01,40,00,00”)。它首先删除“,”,然后转换为 16 字节(40 - 0x40)。然后,它将字节数组发送到 COM 端口并更改无线电上的频率。

 public void WriteTx(string tx)
        {
            
            string a = tx.Substring(0, 2);
            string b = tx.Substring(3, 2);
            string c = tx.Substring(6, 2);
            string d = tx.Substring(9, 2);
           
          
            byte[] talbyte = { Convert.ToByte(a, 16), Convert.ToByte(b, 16), Convert.ToByte(c, 16), Convert.ToByte(d, 16), 0x01};
          
            try {


                
                    comPort.Write(talbyte, 0, talbyte.Length);
               
            }
            catch  {  }
            
        }

CW 控制器中的这段代码从文本框中获取文本并将其翻译成莫尔斯电码。例如:“abc de” “.-¤-...¤-.-. -..¤.” ¤ 设置在字母之间,空格只是一个空格。

 public void createCW(string text, int wpm)
        {
            text = text.ToLower();
            int dit = 1200 / wpm;
            string cwText = "";
            char[] ctext = text.ToCharArray();
            for(int i=0; i<ctext.Length; i++)
            {
                cwText += CW(ctext[i]);
                cwText += "¤";

            }
            sentCW(cwText, dit);
        }

private string CW(char letter)
        {   
            string cwtext = "";
            switch (letter)
            {
                case 'a':
                    cwtext = ".-";
                    break;
                case 'b':
                    cwtext = "-...";
                    break;

CW 控制器中的这段代码将代码发送到无线电。它打开 COM 端口,当 DRT 为真时,它发送一个音调,并在 DRT 为假时关闭。 Thread.sleeping 表示音调必须发送多长时间或在发送下一个字母之前等待多长时间。“dit”是“.”,“dah”是“-”。

 private void sentCW(string cwtext, int dit)
        {
            try
            {
                int dah = 3 * dit;
                int space = 5 * dit;
                comPort.Open();
                char[] cw = cwtext.ToCharArray();
                for (int a = 0; a < cw.Length; a++)
                {
                    switch (cw[a])
                    {
                        case '.':
                            comPort.DtrEnable = true; ;
                            System.Threading.Thread.Sleep(dit);
                            comPort.DtrEnable = false;
                            break;
                        case '-':
                            comPort.DtrEnable = true; ;
                            System.Threading.Thread.Sleep(dah);
                            comPort.DtrEnable = false;
                            break;
                        case '¤':

                            System.Threading.Thread.Sleep(dah);

                            break;
                        case ' ':

                            System.Threading.Thread.Sleep(space);

                            break;
                    }
                    System.Threading.Thread.Sleep(dit);
                }
                comPort.Close();
            }
            catch { MessageBox.Show("You have to connect a CW Com Port."); }
        }

该程序是用 C# 编写的。

关注点

当我开始编写 Windows 应用程序时,我认为我无法使其工作。它看起来太困难了,我非常担心当我订购电缆时它会如何工作。我订购了两次电缆。首先是 CAT 电缆和 USB 转 USB 电缆。在那之后,我订购了 USB-SERIAL 和 SERIAL-to-SERIAL 以及两个 10kOhm 电阻器和 NPN BD 135 晶体管,因为我还必须焊接一些组件。我不擅长电子学,所以我认为我可能无法完成该项目。但是我对它的简单程度感到非常惊讶,而且我还能够学习有关线程休眠的知识。

当我更改无线电上的频率时遇到了问题。它只会更改 Tx 频率,而不会更改 Rx 频率,但我被告知我只需要在代码中添加线程休眠即可。

此代码位于 Form1.cs 中,并在单击无线电或内存选项卡中的“更新”按钮时激活。

 private void Update_Write(string con)
        {
           
            FT857D_CatControl.Instance.PortName = comboPortsCAT.Text;
            FT857D_CWControl.Instance.PortName = comboPortsCW.Text;
            FT857D_CatControl.Instance.DisplayWindow = rtbDisplay;
            FT857D_CWControl.Instance.DisplayWindow = rtbDisplay;
            SerialPort comPort = FT857D_CatControl.Instance.OpenPort();
            SerialPort comPort1 = FT857D_CWControl.Instance.OpenPort();
            nr++;
            if (con == "ptt")
            {
                  if (comPort.CtsHolding)
                  {
                try
                {
                    string msgMode = comboMode.Text;             
                    FT857D_CatControl.Instance.SetMode(msgMode);

                    FT857D_CatControl.Instance.ToggleVFO();
                    System.Threading.Thread.Sleep(200);
                    FT857D_CatControl.Instance.SetMode(msgMode);
                    string msgTx = lblFreTx_0.Text + lblFreTx_1.Text + "," + lblFreTx_2.Text + lblFreTx_3.Text + "," + lblFreTx_4.Text + lblFreTx_5.Text + "," + lblFreTx_6.Text + lblFreTx_7.Text;
                    FT857D_CatControl.Instance.WriteTx(msgTx);
                    System.Threading.Thread.Sleep(200);
                    FT857D_CatControl.Instance.ToggleVFO();

                    System.Threading.Thread.Sleep(200);
                    FT857D_CatControl.Instance.SetMode(msgMode);
                    string msgRx = lblFreRx_0.Text + lblFreRx_1.Text + "," + lblFreRx_2.Text + lblFreRx_3.Text + "," + lblFreRx_4.Text + lblFreRx_5.Text + "," + lblFreRx_6.Text + lblFreRx_7.Text;
                    FT857D_CatControl.Instance.WriteRx(msgRx);
                  

                }
                catch (Exception ex) { MessageBox.Show(ex.ToString()); }
                     
                    }
                         else { MessageBox.Show("You kneed to Connect your Radio"); }
            }

            FT857D_CatControl.Instance.ClosePort();

            FT857D_CWControl.Instance.ClosePort();
        }

listview 上的图像。在 Form1.cs

 private void FillHelpTop()
        {
            listViewHelpTop.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
            ListViewItem item1 = new ListViewItem("Connect CAT", 0);
            item1.SubItems.Add("Connect");
            ListViewItem item2 = new ListViewItem("Connect CW", 0);
            item2.SubItems.Add("Connect");
            ListViewItem item3 = new ListViewItem("Select frequency", 1);
            item3.SubItems.Add("Radio");
            ListViewItem item4 = new ListViewItem("Edit Memory Stations", 2);
            item4.SubItems.Add("Memory");
            ListViewItem item5 = new ListViewItem("Wheater", 1);
            item5.SubItems.Add("Radio");
            ListViewItem item6 = new ListViewItem("Sent CW", 3);
            item6.SubItems.Add("CW");
            listViewHelpTop.Items.AddRange(new ListViewItem[] { item1, item2, item3,item4,item5,item6 });
        }

通过鼠标点击更改频率

 private void lbl_MouseClick(object sender, MouseEventArgs e, string box)
        {
            int btTal = 0;
            switch (e.Button)
            {

                case MouseButtons.Left:
                    
                    btTal = -1;
                    break;

                case MouseButtons.Right:
                   
                    btTal = 1;
                    break;
            }
            int tal = 0;
            switch(box)
            {
                case "Tx0": tal = int.Parse(lblFreTx_0.Text) + btTal;
                    if (tal < 0) { tal = 4; } else if (tal >  4) { tal = 0; }
                    lblFreTx_0.Text = tal.ToString();
                    lblMemTx_0.Text = tal.ToString();
                    break;
                case "Tx1":
                    tal = int.Parse(lblFreTx_1.Text) + btTal;
                    if (tal < 0) { tal = 9; } else if (tal >  9) { tal = 0; }
                    lblFreTx_1.Text = tal.ToString();
                    lblMemTx_1.Text = tal.ToString();
                    break;

历史

  • 1.0 版(从未发布仅用于测试)用于无线电内存的 XML 数据库以及更改无线电上的频率。
  • 2.0 版(此版本)用于 CW 内存的 XML 数据库,莫尔斯电码文本可以通过无线电发送。

谢谢

感谢 Michael OZ8AGB 指导我完成该项目,并且这是他让我创建该项目的想法。

感谢 Bjarne OZ7BKJ 在 xml 网关方面的帮助。

感谢 Niels OZ5NM 向我展示了如何焊接电阻器和晶体管的图表。

感谢我的小弟弟 Brian 指导我如何创建 CW 翻译器。

连接到 Com 端口的代码是我在 WEB 上找到的。

© . All rights reserved.