質問編集履歴
1
必要のない箇所の削除
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,369 +1,1 @@
|
|
1
|
-
Qt↔マイコン(MT-RL78)のシリアル通信をして、マイコン上にあるボリュームの値の大きさをQtに渡したいのですがやり方が分からないのでどうかご教授ください。
|
1
|
+
Qt↔マイコン(MT-RL78)のシリアル通信をして、マイコン上にあるボリュームの値の大きさをQtに渡したいのですがやり方が分からないのでどうかご教授ください。
|
2
|
-
|
3
|
-
・A/D変換の開始となる、
|
4
|
-
```
|
5
|
-
ADCS = 1; /* A/D変換の開始 */
|
6
|
-
```
|
7
|
-
を組み込むと、Qtの起動と同時にC言語が落ちます。
|
8
|
-
|
9
|
-
```Qt
|
10
|
-
/***** スタート画面 *****/
|
11
|
-
#include "mainwindow.h"
|
12
|
-
#include "ui_mainwindow.h"
|
13
|
-
#include <QPalette>
|
14
|
-
#include <QDebug>
|
15
|
-
#include <QtWidgets>
|
16
|
-
#include "question1.h"
|
17
|
-
|
18
|
-
MainWindow::MainWindow(QWidget *parent) :
|
19
|
-
QMainWindow(parent),
|
20
|
-
ui(new Ui::MainWindow)
|
21
|
-
,m_serial(new QSerialPort(this))
|
22
|
-
{
|
23
|
-
ui->setupUi(this);
|
24
|
-
buffer.clear();
|
25
|
-
|
26
|
-
// portName : COMポート名はデバイスマネージャーで確認すること
|
27
|
-
m_serial->setPortName(QString("COM3"));
|
28
|
-
|
29
|
-
// COMポートでつながれたハードウェアで指定された数値を指定する。
|
30
|
-
m_serial->setBaudRate(QSerialPort::Baud38400);
|
31
|
-
m_serial->setDataBits(QSerialPort::Data8);
|
32
|
-
m_serial->setParity( QSerialPort::OddParity);
|
33
|
-
m_serial->setStopBits(QSerialPort::OneStop);
|
34
|
-
|
35
|
-
if(m_serial->open(QIODevice::ReadWrite)) //送受信できる設定
|
36
|
-
{
|
37
|
-
connect(m_serial,&QSerialPort::readyRead,
|
38
|
-
this,&MainWindow::printData);
|
39
|
-
}
|
40
|
-
else
|
41
|
-
{
|
42
|
-
qDebug() << "Couldn't open the port[COM3].";
|
43
|
-
}
|
44
|
-
/* 50ms毎にシグナルを送り、Send_Data()スロットを起動 */
|
45
|
-
m_timer->setInterval(SPEED);
|
46
|
-
m_timer->setSingleShot(false);
|
47
|
-
connect(m_timer,SIGNAL(timeout()),SLOT(Send_Data()));
|
48
|
-
m_timer->start();
|
49
|
-
|
50
|
-
jumpquestion1 = new question1(this);
|
51
|
-
jumpcorrect = new Correct (this);
|
52
|
-
jumpincorrect = new Incorrect (this);
|
53
|
-
|
54
|
-
setStyleSheet( "* {background-color : rgb( 255, 255, 128 )}" ); //背景色指定
|
55
|
-
}
|
56
|
-
|
57
|
-
MainWindow::~MainWindow()
|
58
|
-
{
|
59
|
-
m_serial->close();
|
60
|
-
disconnect(m_serial,&QSerialPort::readyRead,this,&MainWindow::printData );
|
61
|
-
delete m_serial;
|
62
|
-
delete ui;
|
63
|
-
|
64
|
-
delete jumpquestion1;
|
65
|
-
delete jumpcorrect;
|
66
|
-
delete jumpincorrect;
|
67
|
-
}
|
68
|
-
|
69
|
-
void MainWindow::printData()
|
70
|
-
{
|
71
|
-
QString AAA;
|
72
|
-
|
73
|
-
if(sender() == m_serial)
|
74
|
-
{
|
75
|
-
buffer.append(m_serial->readAll());
|
76
|
-
if(buffer.contains("\r"))
|
77
|
-
{
|
78
|
-
|
79
|
-
//区切り文字が含まれていたら表示してバッファクリア
|
80
|
-
QString data = QString(buffer);
|
81
|
-
if(data.compare("\n1\n\r", Qt::CaseSensitive) == 0){
|
82
|
-
AAA = "5";
|
83
|
-
m_serial->write(AAA.toUtf8()); //送信時はバイナリデータに変換
|
84
|
-
jumpquestion1 -> show(); //ボタンを押したときquestion1画面へ切り替え
|
85
|
-
m_timer->stop();
|
86
|
-
|
87
|
-
}
|
88
|
-
|
89
|
-
buffer.clear();
|
90
|
-
}
|
91
|
-
}
|
92
|
-
}
|
93
|
-
void MainWindow::Send_Data ()
|
94
|
-
{
|
95
|
-
QString CCC;
|
96
|
-
CCC = "8";
|
97
|
-
m_serial->write(CCC.toUtf8()); //送信時はバイナリデータに変換
|
98
|
-
buffer.clear();
|
99
|
-
}
|
100
|
-
|
101
|
-
|
102
|
-
```
|
103
|
-
***
|
104
|
-
Qt↑
|
105
|
-
C言語↓
|
106
|
-
***
|
107
|
-
```C
|
108
|
-
#pragma sfr
|
109
|
-
#pragma NOP
|
110
|
-
#pragma EI
|
111
|
-
#pragma interrupt INTST0 int_trmpro
|
112
|
-
#pragma interrupt INTSR0 int_rcvpro
|
113
|
-
#pragma interrupt INTSRE0 int_errpro
|
114
|
-
#include "slos.h"
|
115
|
-
|
116
|
-
/******************************************************************************
|
117
|
-
* 関数プロトタイプ宣言
|
118
|
-
*******************************************************************************/
|
119
|
-
void init_uart(void);
|
120
|
-
void PORT_Init(void);
|
121
|
-
void __near int_trmpro(void) ;
|
122
|
-
void __near int_rcvpro(void) ;
|
123
|
-
void __near int_errpro(void) ;
|
124
|
-
|
125
|
-
/******************************************************************************
|
126
|
-
* グローバルデータ
|
127
|
-
*******************************************************************************/
|
128
|
-
unsigned char f_rcv_end ;
|
129
|
-
unsigned short rcv_data ;
|
130
|
-
const char *msg_p ;
|
131
|
-
|
132
|
-
//char j[100];
|
133
|
-
//j[0] = "ADCRH";
|
134
|
-
|
135
|
-
const char msg1[] = "\n2\n\r" ;
|
136
|
-
//const char msg2[] = ADCRH ;
|
137
|
-
const char msg3[] = "\n1\n\r" ;
|
138
|
-
const char msg_err[] = "\n Mistakes. Please retry.\n\r" ;
|
139
|
-
|
140
|
-
const char ans1[] = "\nA1\n\r";
|
141
|
-
const char ans2[] = "\nA2\n\r";
|
142
|
-
const char ans3[] = "\nA3\n\r";
|
143
|
-
const char ans4[] = "\nA4\n\r";
|
144
|
-
|
145
|
-
/***********************************/
|
146
|
-
/*** reset process ***/
|
147
|
-
/***********************************/
|
148
|
-
void uinit(void)
|
149
|
-
{
|
150
|
-
TAU0EN |= 0x01U;
|
151
|
-
TPS0 = 0x0000;
|
152
|
-
TMR00 = 0x0000;
|
153
|
-
|
154
|
-
|
155
|
-
/* ポートのイニシャライズ */
|
156
|
-
PM0 = 0x1;
|
157
|
-
|
158
|
-
|
159
|
-
/* A/D変換器のイニシャライズ */
|
160
|
-
ADCEN = 1; /* A/D変換器にクロックを供給 */
|
161
|
-
ADS = 0x12; /* ANI18を選択 */
|
162
|
-
ADM1 = 0x20; /* ソフトウェア・トリガ、ワンショット変換モード */
|
163
|
-
ADM2 = 0x01; /* 8ビット分解能 */
|
164
|
-
ADM0 = 0x23; /* セレクトモード */
|
165
|
-
ADPR1 = 1; ADPR0 = 0; /* A/D変換終了の割込みレベルを3に設定 */
|
166
|
-
ADMK = 0; /* A/D変換終了割り込みを許可 */
|
167
|
-
}
|
168
|
-
|
169
|
-
/******************************************************************************
|
170
|
-
* Initial I/O Port Function
|
171
|
-
*******************************************************************************/
|
172
|
-
void PORT_Init(void)
|
173
|
-
{
|
174
|
-
P7 = 0x00; // Default is OFF
|
175
|
-
PM7 = 0x00; // PORT7 OUTPUT
|
176
|
-
P5 = 0xcf; // DEG0 is ON
|
177
|
-
PM5 = 0xcf; // PORT5 bit4 is OUTPUT
|
178
|
-
}
|
179
|
-
|
180
|
-
/******************************************************************************
|
181
|
-
* Initial SAU Function
|
182
|
-
*******************************************************************************/
|
183
|
-
void init_uart(void)
|
184
|
-
{
|
185
|
-
|
186
|
-
SAU0EN = 1; // シリアルアレイユニット0イネーブル
|
187
|
-
NOP();NOP();NOP();NOP(); // fCLK 4クロック分ウェイト
|
188
|
-
|
189
|
-
SPS0 = 0x0022; // シリアルクロック分周比設定
|
190
|
-
// (ck00,ck01=8MHz(fclk=32MHz選択時) or 5MHz(fclk=20MHz選択時))
|
191
|
-
|
192
|
-
// *** UART0送信側(Unit:0,ch:0)設定 ***
|
193
|
-
SMR00 = 0x0023; // 動作モード:UART、転送クロック:ck00を選択、
|
194
|
-
// スタートトリガ:S/Wトリガ(送信時のみ)、送信割り込みタイミング:バッファ空き時
|
195
|
-
SCR00 = 0x8397; // 送信のみ実施、8bit、1SP、奇数パリティあり、LSB_first、エラー割り込みマスク
|
196
|
-
SDR00 = 0xce00; // ボーレート設定(38400bps(SDR[15:9]=206))
|
197
|
-
|
198
|
-
SOE0L = 1; // シリアル出力許可(SO0レジスタ書き換え不可)
|
199
|
-
|
200
|
-
// *** UART0受信側(Unit:0,ch:1)設定 ***
|
201
|
-
SMR01 = 0x0122; // 動作モード:UART、転送クロック:ck00を選択、
|
202
|
-
// スタートトリガ:RxD端子有効エッジ(受信時のみ)、スタートビット検出:立ち下がりエッジ
|
203
|
-
SCR01 = 0x4797; // 受信のみ実施、8bit、1SP、LSB_first、奇数パリティ、エラー割り込み発生許可
|
204
|
-
SDR01 = 0xce00; // ボーレート設定(38400bps(SDR[15:9]=206))
|
205
|
-
|
206
|
-
NFEN0 = 1; // RxD0端子のノイズフィルタをON
|
207
|
-
|
208
|
-
PM5 &= ~0x02; // TxD0該当端子を出力モードに設定
|
209
|
-
P5 |= 0x02; // TxD出力を有効化
|
210
|
-
PM5 |= 0x01; // RxD0該当端子を入力モードに設定
|
211
|
-
|
212
|
-
// 送受信割り込み設定
|
213
|
-
STPR00 = 1; // Int priorty = 1
|
214
|
-
STPR10 = 0;
|
215
|
-
STMK0 = 0; // Enable UART0 trm interrupt(Mask Clear)
|
216
|
-
|
217
|
-
SRPR00 = 1; // Int priorty = 1
|
218
|
-
SRPR10 = 0;
|
219
|
-
SRMK0 = 0; // Enable UART0 rcv interrupt(Mask Clear)
|
220
|
-
|
221
|
-
SREPR00 = 0; // Int priorty = 2
|
222
|
-
SREPR10 = 1;
|
223
|
-
SREMK0 = 0; // Enable UART0 RcvErr interrupt(Mask Clear)
|
224
|
-
|
225
|
-
SS0L = 0x03; // Unit0 送信(ch0),受信(ch1)開始
|
226
|
-
|
227
|
-
}
|
228
|
-
void TAU0_Start(void);
|
229
|
-
void TAU0_Stop(void);
|
230
|
-
|
231
|
-
void TAU0_Start(void)
|
232
|
-
{
|
233
|
-
TOE0 |= 0x01U;
|
234
|
-
TS0 |= 0x01U;
|
235
|
-
}
|
236
|
-
void TAU0_Stop(void)
|
237
|
-
{
|
238
|
-
TT0 |= 0x01U;
|
239
|
-
TOE0 &= 0x01U;
|
240
|
-
}
|
241
|
-
__rtos_interrupt void intTim(void)
|
242
|
-
{
|
243
|
-
slos_cyclic_timer( ); /* 周期タイマ処理をコース */
|
244
|
-
}
|
245
|
-
|
246
|
-
|
247
|
-
/***********************************/
|
248
|
-
/*** sample tasks ***/
|
249
|
-
/***********************************/
|
250
|
-
|
251
|
-
void serial_tsk(void) /* プライオリティタスク */
|
252
|
-
{
|
253
|
-
W i = 0 ;
|
254
|
-
char msg2[]="\nA1\n";
|
255
|
-
//unsigned short
|
256
|
-
W ercd;
|
257
|
-
//int AA = ADCRH;
|
258
|
-
char buf[8] = {'\0'};
|
259
|
-
|
260
|
-
// = 0x950FU;
|
261
|
-
//TAU0_Start();
|
262
|
-
|
263
|
-
PORT_Init();
|
264
|
-
init_uart() ; // SCI初期化関数呼び出し
|
265
|
-
EI();
|
266
|
-
while( 1 ) {
|
267
|
-
if(f_rcv_end){ // 受信割り込み待ち
|
268
|
-
//ADCS = 1; /* A/D変換の開始 */
|
269
|
-
f_rcv_end = 0;
|
270
|
-
/* 受信データのチェック */
|
271
|
-
switch((unsigned char)rcv_data){
|
272
|
-
/*省略*/
|
273
|
-
case '8':
|
274
|
-
ercd = ADCRH;
|
275
|
-
ercd = ercd & 0xFF;
|
276
|
-
if(P13.7 == 0){
|
277
|
-
for( i=0 ; i<10000; i++ ) ; /* チャタリング対策 */
|
278
|
-
while( P13.7 == 0 ) ;
|
279
|
-
msg_p = msg3;
|
280
|
-
}
|
281
|
-
if(P3.1 == 0){
|
282
|
-
for( i=0 ; i<10000; i++ ) ; /* チャタリング対策 */
|
283
|
-
while( P3.1 == 0 ) ;
|
284
|
-
if(ercd >= 0 && ercd < 64){
|
285
|
-
msg_p = ans1;
|
286
|
-
}else if(ercd < 128){
|
287
|
-
msg_p = ans2;
|
288
|
-
}else if(ercd < 192){
|
289
|
-
msg_p = ans3;
|
290
|
-
}else if(ercd < 256){
|
291
|
-
msg_p = ans4;
|
292
|
-
}
|
293
|
-
}
|
294
|
-
break;
|
295
|
-
|
296
|
-
case '9':
|
297
|
-
msg_p = msg3;
|
298
|
-
break;
|
299
|
-
default :
|
300
|
-
msg_p = msg_err ;
|
301
|
-
}
|
302
|
-
while((SSR00L & 0x40)) ; // 文字列送信完了まで待ち
|
303
|
-
SDR00 = *msg_p; // 送信メッセージの最初の文字を
|
304
|
-
// 送信バッファ(SDR00)へ格納
|
305
|
-
}
|
306
|
-
}
|
307
|
-
}
|
308
|
-
|
309
|
-
void temp(void)
|
310
|
-
{
|
311
|
-
|
312
|
-
}
|
313
|
-
|
314
|
-
/******************************************************************************
|
315
|
-
* Interruput Function
|
316
|
-
*******************************************************************************/
|
317
|
-
/******************************************************************************
|
318
|
-
* UART0 Recieve Interrupt Function
|
319
|
-
*******************************************************************************/
|
320
|
-
void __near int_rcvpro(void)
|
321
|
-
{
|
322
|
-
rcv_data = SDR01; // 受信データ読み出し
|
323
|
-
f_rcv_end = 1; // 受信完了フラグセット
|
324
|
-
P7 = 0; // エラー表示クリア
|
325
|
-
|
326
|
-
}
|
327
|
-
|
328
|
-
/******************************************************************************
|
329
|
-
* UART0 transmit Interrupt Function
|
330
|
-
*******************************************************************************/
|
331
|
-
void __near int_trmpro(void)
|
332
|
-
{
|
333
|
-
msg_p++; // メッセージポインタ更新
|
334
|
-
if(*msg_p != '\0') // 文字列送信完了(NULLコードか)確認
|
335
|
-
SDR00 = *msg_p; // 送信データをSDRレジスタへ設定
|
336
|
-
|
337
|
-
}
|
338
|
-
|
339
|
-
|
340
|
-
/******************************************************************************
|
341
|
-
* UART0 Err Function
|
342
|
-
*******************************************************************************/
|
343
|
-
void __near int_errpro(void)
|
344
|
-
{
|
345
|
-
unsigned char err_sts;
|
346
|
-
|
347
|
-
err_sts = SSR01L & 0x07; // 受信エラーフラグ読み出し
|
348
|
-
|
349
|
-
switch(err_sts){ // エラー処理
|
350
|
-
case 0x01: // オーバフローエラー
|
351
|
-
P7 = 0x3f; // 7seg.LEDに'OO'を表示
|
352
|
-
break;
|
353
|
-
case 0x02: // パリティーエラー
|
354
|
-
P7 = 0x73; // 7seg.LEDに'PP'を表示
|
355
|
-
break;
|
356
|
-
case 0x04: // フレーミングエラー
|
357
|
-
P7 = 0x71; // 7seg.LEDに'FF'を表示
|
358
|
-
break;
|
359
|
-
}
|
360
|
-
|
361
|
-
SIR01L = 0x07; // 受信エラーフラグクリア
|
362
|
-
rcv_data = SDR01; // ch1のBFFフラグクリアのためのダミーリード
|
363
|
-
}
|
364
|
-
|
365
|
-
void cyc(UB cid)
|
366
|
-
{
|
367
|
-
P0.1 = ~P0.1;
|
368
|
-
}
|
369
|
-
```
|