FT857D Manager 火腿无线电控制器






4.50/5 (2投票s)
更改频率、模式并在无线电上发送莫尔斯电码
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
引言
该代码通过 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 上找到的。