開発環境は、送信側はC#、Visual Studio 2019 windows フォームアプリケーション(.NET Framework)、受信側はc言語でCube Suite+です。マイコンは78K0R、UART-シリアル変換モジュールはFT232RLを使っています。
track barをスクロールするたびに、track barの値をシリアル通信で送信するということをしているのですが、スクロールの動きが速い場合に上手く通信できない部分があるので、通信の精度をより高めたいと思っています。例えば、track barを10から一気に1までスクロールした際に、受信側では1や2といった値で受け取ってしまします。これをより正確に送信するには、どうすればよいでしょうか?
仮想ポートを作り確認してみたところ、例えば10から0に一気に動かしたときに受信側を確認してみると、
R009R007R006R004R002R000
のように途中の値はとびとびになりますが、最後の値はちゃんと送信できているということが分かりました。やはり問題は受信側かなと思います。
送信側のコードを示しておきます。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp6 { public partial class Form1 : Form { public Form1() { InitializeComponent(); mySerialPort.Open(); } private string StringR, StringG, StringB; private void Form1_Load(object sender, EventArgs e) { //trackBar1の設定 // 最小値、最大値を設定 trackBar1.Minimum = 0; trackBar1.Maximum = 100; // 初期値を設定 trackBar1.Value = 0; // 描画される目盛りの刻みを設定 trackBar1.TickFrequency = 10; // スライダーをキーボードやマウス、 // PageUp,Downキーで動かした場合の移動量設定 trackBar1.SmallChange = 1; trackBar1.LargeChange = 10; // 値が変更された際のイベントハンドラーを追加 trackBar1.ValueChanged += new EventHandler(trackBar1_ValueChanged); //trackBar2の設定 // 最小値、最大値を設定 trackBar2.Minimum = 0; trackBar2.Maximum = 100; // 初期値を設定 trackBar2.Value = 0; // 描画される目盛りの刻みを設定 trackBar2.TickFrequency = 10; // スライダーをキーボードやマウス、 // PageUp,Downキーで動かした場合の移動量設定 trackBar2.SmallChange = 1; trackBar2.LargeChange = 10; // 値が変更された際のイベントハンドラーを追加 trackBar2.ValueChanged += new EventHandler(trackBar2_ValueChanged); //trackBar3の設定 // 最小値、最大値を設定 trackBar3.Minimum = 0; trackBar3.Maximum = 100; // 初期値を設定 trackBar3.Value = 0; // 描画される目盛りの刻みを設定 trackBar3.TickFrequency = 10; // スライダーをキーボードやマウス、 // PageUp,Downキーで動かした場合の移動量設定 trackBar3.SmallChange = 1; trackBar3.LargeChange = 10; // 値が変更された際のイベントハンドラーを追加 trackBar3.ValueChanged += new EventHandler(trackBar3_ValueChanged); } private void trackBar1_ValueChanged(object sender, EventArgs e) { // TrackBar1の値が変更されたらラベルに表示 label1.Text = trackBar1.Value.ToString(); //TrackBarの値を文字列に変換( StringR = "R" + trackBar1.Value.ToString("D3"); //送信 mySerialPort.Write(StringR); } private void trackBar2_ValueChanged(object sender, EventArgs e) { // TrackBar2の値が変更されたらラベルに表示 label2.Text = trackBar2.Value.ToString(); //TrackBarの値を文字列に変換( StringG = "G" + trackBar2.Value.ToString("D3"); //送信 mySerialPort.Write(StringG); } private void trackBar3_ValueChanged(object sender, EventArgs e) { // TrackBar3の値が変更されたらラベルに表示 label3.Text = trackBar3.Value.ToString(); //TrackBarの値を文字列に変換( StringB = "B" + trackBar3.Value.ToString("D3"); //送信 mySerialPort.Write(StringB); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); } } }
受信側のコードも一部示しておきます。
__interrupt
1{ 2 /* Start user code. Do not edit comment generated here */ 3 4 //タイマ割り込み(0.1秒ごと)// 5 6 7 UART0_ReceiveData(receive, 4); //文字列でデータ受信 8 9 //numerical = atoi(receive); //文字列を数値に変換 10 11 if(receive[0] == 'R') 12 { 13 14 numericalR = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 15 TAU0_Channel2_ChangeDuty((unsigned char)numericalR); //デューティー比変更(赤) 16 17 } 18 19 if(receive[0] == 'G') 20 { 21 22 numericalG = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 23 TAU0_Channel1_ChangeDuty((unsigned char)numericalG); //デューティー比変更(緑) 24 25 } 26 27 28 if(receive[0] == 'B') 29 { 30 31 numericalB = 100 * (receive[1] - '0') + 10 * (receive[2] - '0') + (receive[3] - '0'); //数値に変換 32 TAU0_Channel3_ChangeDuty((unsigned char)numericalB); //デューティー比変更(青) 33 34 } 35コード
受信を行う関数
MD_STATUS
1{ 2 MD_STATUS status = MD_OK; 3 4 if (rxnum < 1U) 5 { 6 status = MD_ARGERROR; 7 } 8 else 9 { 10 gUart0RxCnt = 0U; 11 gUart0RxLen = rxnum; 12 gpUart0RxAddress = rxbuf; 13 } 14 15 return (status); 16} 17コード
回答4件
あなたの回答
tips
プレビュー