BQB pts测试

article/2025/6/19 12:38:06

测试BQB的pts dongle是在蓝牙SIG官网买的,链接是
https://store.bluetooth.com/12210888/orders/d3b63cfd9d3d5a22c2e08ad9711a91c4

pts dongle最新的测试结果
ACS-BV-07-I/ACS-BV-12-I/ACS-BI-13-I 这三个是接完电话就fail
ICA-BV-02-I/TCA-BV-01-I 这两个是挂不了电话
ICR-BV-01-I 这个是拒接电话的
TCA-BV-04-I 这个需要拨打电话,再挂断的
ATH-BV-04-I 建立SCO连接
OOR-BV-02-I/SLC-bv-03-c 建立SLC连接

pts_setup_7_4_1.exe下载链接
安装pts_setup_6_0_1.exe后,接入dongle,dongle的驱动在安装目录下
在这里插入图片描述
选择设备管理,重新导入就可以安装驱动成功
打开pts
file->new workspace

填入设备的mac地址
在这里插入图片描述
点next
输入工程的名字与路径

在这里插入图片描述

解锁
在这里插入图片描述

在这里插入图片描述

这些测试是反项测试,fail表示支持这个profile,只需要在ics里配置并再次测试通过即可

在这里插入图片描述在这里插入图片描述

这里表示相应打勾都支持了
在这里插入图片描述

在这里插入图片描述

如下是支持a2dp sink,headset HF ,avrcp TG的角色
在这里插入图片描述

测试hfp
添加一下工程HFP
在这里插入图片描述
打开ICS,如图选HFP
在这里插入图片描述在这里插入图片描述
所有选项,不需要全部都要测试的,Matter部分一定要测试,Option可以选测的,后边有M的都是Matter部分,带O的是Option部分
在这里插入图片描述
在这里插入图片描述

如同样的方法创建a2dp
在这里插入图片描述

方法选择测试什么选项,下面都有要求在ICS里打上哪些勾
在这里插入图片描述

测试失败的都打!,成功的都打勾

在这里插入图片描述

测试中需要关掉不必要的profile,修改avrcp tg的版本为非1.4,因为1.4在BQB测试中已弃用了

Index: android/packages/apps/Bluetooth/res/values/config.xml
===================================================================
--- android/packages/apps/Bluetooth/res/values/config.xml       (revision 266)
+++ android/packages/apps/Bluetooth/res/values/config.xml       (revision 267)
@@ -17,15 +17,15 @@<bool name="profile_supported_a2dp_sink">true</bool><bool name="profile_supported_hdp">true</bool><bool name="profile_supported_hs_hfp">true</bool>
-    <bool name="profile_supported_hfpclient">false</bool>
-    <bool name="profile_supported_hid">true</bool>
-    <bool name="profile_supported_opp">true</bool>
-    <bool name="profile_supported_pan">true</bool>
-    <bool name="profile_supported_pbap">true</bool>
+    <bool name="profile_supported_hfpclient">true</bool>
+    <bool name="profile_supported_hid">false</bool>
+    <bool name="profile_supported_opp">false</bool>
+    <bool name="profile_supported_pan">false</bool>
+    <bool name="profile_supported_pbap">false</bool><bool name="profile_supported_gatt">true</bool>
-    <bool name="pbap_include_photos_in_vcard">true</bool>
-    <bool name="pbap_use_profile_for_owner_vcard">true</bool>
-    <bool name="profile_supported_map">true</bool>
+    <bool name="pbap_include_photos_in_vcard">false</bool>
+    <bool name="pbap_use_profile_for_owner_vcard">false</bool>
+    <bool name="profile_supported_map">false</bool><bool name="profile_supported_avrcp_controller">true</bool><bool name="profile_supported_sap">false</bool><bool name="profile_supported_pbapclient">false</bool>
Index: android/device/qcom/msm8909/msm8909.mk
===================================================================
--- android/device/qcom/msm8909/msm8909.mk      (revision 266)
+++ android/device/qcom/msm8909/msm8909.mk      (revision 267)
@@ -273,3 +273,4 @@PRODUCT_PROPERTY_OVERRIDES += ro.custom.build.version=$(BUILD_VERSION)PRODUCT_PROPERTY_OVERRIDES += ro.custom.build.mic.version=$(BUILD_MIC_VERSION)PRODUCT_PROPERTY_OVERRIDES += persist.service.bt.a2dp.sink=true 
+PRODUCT_PROPERTY_OVERRIDES += persist.service.bt.hfp.client=true
\ No newline at end of file
Index: android/device/qcom/common/product/overlay/packages/apps/Bluetooth/res/values/config.xml
===================================================================
--- android/device/qcom/common/product/overlay/packages/apps/Bluetooth/res/values/config.xml    (revision 266)
+++ android/device/qcom/common/product/overlay/packages/apps/Bluetooth/res/values/config.xml    (revision 267)
@@ -33,5 +33,5 @@<bool name="profile_supported_hfpclient">false</bool><bool name="profile_supported_avrcp_controller">true</bool><bool name="profile_supported_a2dp_sink">true</bool>
-    <bool name="profile_supported_sap">true</bool>
+    <bool name="profile_supported_sap">false</bool></resources>
Index: android/vendor/qcom/opensource/bluetooth/res/values/config.xml
===================================================================
--- android/vendor/qcom/opensource/bluetooth/res/values/config.xml      (revision 278)
+++ android/vendor/qcom/opensource/bluetooth/res/values/config.xml      (revision 279)
@@ -13,8 +13,8 @@limitations under the License.--><resources>
-    <bool name="profile_supported_ftp">true</bool>
+    <bool name="profile_supported_ftp">false</bool><bool name="profile_supported_map">false</bool><bool name="profile_supported_sap">false</bool>
-    <bool name="profile_supported_dun">true</bool>
+    <bool name="profile_supported_dun">false</bool></resources>
Index: android/system/bt/bta/av/bta_av_main.cc
===================================================================
--- android/system/bt/bta/av/bta_av_main.cc     (revision 278)
+++ android/system/bt/bta/av/bta_av_main.cc     (revision 279)
@@ -520,7 +520,8 @@profile_version = AVRC_REV_1_6;} else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) {// Initialize AVRCP1.4 to provide Absolute Volume control.
-          profile_version = AVRC_REV_1_4;
+          profile_version = AVRC_REV_1_3;
+          //profile_version = AVRC_REV_1_4;}bta_ar_reg_avrc(

添加接电话挂电话的功能
用平台的两个按键支持,这里为电话键是接听挂断,录音按键是拒接
只需要在原来接听按键的基础上添加判断正在通话,再挂断电话,在录音按键中处理挂断按键的功能

Index: android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
===================================================================
--- android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java        (revision 279)
+++ android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java        (revision 280)
@@ -6305,6 +6305,38 @@msg.setAsynchronous(true);msg.sendToTarget();}
+                               if (down) {
+                                   TelecomManager telecomManager = getTelecommService();
+                                   boolean hungUp = false;
+                                   if (telecomManager != null) {
+                                       hungUp = telecomManager.endCall();
+                                   }
+                                   if (interactive && !hungUp) {
+                                       mEndCallKeyHandled = false;
+                                       mHandler.postDelayed(mEndCallLongPress,
+                                               ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
+                                   } else {
+                                       mEndCallKeyHandled = true;
+                                   }
+                               } else {
+                                   if (!mEndCallKeyHandled) {
+                                       mHandler.removeCallbacks(mEndCallLongPress);
+                                       if (!canceled) {
+                                           if ((mEndcallBehavior
+                                                   & Settings.System.END_BUTTON_BEHAVIOR_HOME) != 0) {
+                                               if (goHome()) {
+                                                   break;
+                                               }
+                                           }
+                                           if ((mEndcallBehavior
+                                                   & Settings.System.END_BUTTON_BEHAVIOR_SLEEP) != 0) {
+                                               goToSleep(event.getEventTime(),
+                                                       PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
+                                               isWakeKey = false;
+                                           }
+                                       }
+                                   }
+                               }break;}@@ -6321,6 +6353,11 @@// (which is presumably the InCallScreen.)result &= ~ACTION_PASS_TO_USER;}
+                                               //add by zhongyk
+                                           else    if (telecomManager.isInCall()){
+                                                   telecomManager.endCall();
+                                                   result &= ~ACTION_PASS_TO_USER;
+                                               }}}break;

添加以上代码后就可以支持按键挂断与拒接功能
测试情况如下:
在这里插入图片描述

测试因为我经常烧录,需要换mac地址,老是重建工程麻烦
后来问了同事说,pts dongle可以单独修改工程的测试mac地址,
在这里插入图片描述

在这里插入图片描述
修改后再次测试就生效了,沟通分享很重要

TCA-BV-04-I 这个需要拨打电话,再挂断的
末位重拨功能测试
末位重拨的功能可以在连接上ag后,hf上点上面的按键向ag申请打电话
在这里插入图片描述
在这里插入图片描述
末位重拨的功能流程
在这里插入图片描述
测试发现平台用的是有号码的拨号(本地之前拨号出去的,但清除之后也打不出去,不知道的问题在哪?)
在这里插入图片描述

/********************************************************************************* Function         dial** Description      place a call** Returns          bt_status_t*******************************************************************************/
static bt_status_t dial(UNUSED_ATTR const RawAddress* bd_addr,const char* number) {btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(*bd_addr);if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);if (number) {BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number);} else {BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL);}return BT_STATUS_SUCCESS;
}

在这里插入图片描述
以上协议栈代码说明上层传了电话号码下来,因为实际情况用了ATD而非 BLDN命令
在这里插入图片描述

OOR-BV-02-I
这个测试是将平台放地信号范围外,再放在信号范围内hf向 ag发起连接的过程
分析,从信号弱的地方平台回连pts dongle时, 没有发起sco连接,加上以下patch之后发起平台界面连接dongle时会发起sco连接

diff --git a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java 
index 3dd242ce7..08cfe8c7b 100755 
--- a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java 
+++ b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java 
@@ -113,6 +113,7 @@ public class HeadsetClientStateMachine extends StateMachine { 
public static final Integer HF_ORIGINATED_CALL_ID = new Integer(-1); 
private long OUTGOING_TIMEOUT_MILLI = 10 * 1000; // 10 seconds 
private long QUERY_CURRENT_CALLS_WAIT_MILLIS = 2 * 1000; // 2 seconds 
+ static final int SETUP_XSCO_WHILE_SLC_PENDING = 5 * 1000; // 5seconds // Keep track of audio routing across all devices. 
private static boolean sAudioIsRouted = true; 
@@ -960,7 +961,6 @@ public class HeadsetClientStateMachine extends StateMachine { 
case StackEvent.EVENT_TYPE_ROAMING_STATE: 
case StackEvent.EVENT_TYPE_NETWORK_SIGNAL: 
case StackEvent.EVENT_TYPE_BATTERY_LEVEL: 
- case StackEvent.EVENT_TYPE_CALL: 
case StackEvent.EVENT_TYPE_CALLSETUP: 
case StackEvent.EVENT_TYPE_CALLHELD: 
case StackEvent.EVENT_TYPE_RESP_AND_HOLD: 
@@ -969,6 +969,13 @@ public class HeadsetClientStateMachine extends StateMachine { 
case StackEvent.EVENT_TYPE_VOLUME_CHANGED: 
deferMessage(message); 
break; 
+ case StackEvent.EVENT_TYPE_CALL: 
+ if (event.valueInt == 1) 
+ { 
+ Log.d(TAG, "Connecting: setup SCO later if move to connected" + event.type); 
+ sendMessageDelayed(CONNECT_AUDIO, SETUP_XSCO_WHILE_SLC_PENDING); 
+ } 
+ break; 
case StackEvent.EVENT_TYPE_CMD_RESULT: 
case StackEvent.EVENT_TYPE_SUBSCRIBER_INFO: 
case StackEvent.EVENT_TYPE_CURRENT_CALLS:

cube_orr-bv-02-3.ca.cfa第636帧中发送
Command: HCI_Setup_Synchronous_Connection
且发送状态status:是成功的
之后638返回
Event: HCI_Synchronous_Connection_Complete
但event的status的状态表示:
Status: Unsupported Remote Feature/Unsupported LMP Feature
在这里插入图片描述
但PTS dongle的日志来看,没有收到HCI_Connect_request
在这里插入图片描述
且第一次pts dongle主动连接时平台时,平台在287帧收到
Event: HCI_Connection_Request
且回连了, Command: HCI_Accept_Synchronous_Connection_Request

是否是说明平台主动连接AG时,出错,命令发不出去
原因是:Unsupported Remote Feature/Unsupported LMP Feature

尽管AG和HF都可以触发音频连接,但是编解码和同步连接建立只能有AG侧真正发起(除非其中一个设备是legacy设备)。
在这里插入图片描述
仅当HF通知AG其支持Codec Negotiation时AG才会通过当前的SLC发送AT+BAC命令发起CodecConnection即才会发起Codec协商的动作,AG会根据HF对AT+BAC的应答来选择合适的Codec connection。如下图支持协商时有如下流程,
在这里插入图片描述
如不支持协商,即没有上图协调的流程
在这里插入图片描述
AG将会通知HF在建立Synchronous Connection前使用哪个codec ID。
AG将会发送未经请求的命令+BCS=给HF。HF将以AT+BCS=< CodecID>命令响应,只要该ID是支持的,ID将会和AG发来的未经请求的命令是一样的。但是如果ID不支持,HF将以AT+BAC和其可用的codec作为应答。
如果AG收到的AT+BCS命令的ID和之前其发送的一样,则会发送OK应答,否则发送ERROR。如果AG发送命令+BCS后没有收到AT+BCS而是AT+BAC,这一过程将会结束但是AG在重新选择codec ID后会重新这一过程。
在发送OK响应后,AG将会根据ID打开相应设置的同步连接,而HF在发送AT+BCS=命令后也能够接收同步连接建立请求。
在同步连接建立完成后,codec 连接建立也完成。+BCS命令是对这次和后续连接codec选择。
如果(e)SCOlink无法建立,AG将会重启启动CodecConnection建立过程。在Codec connection建立连接之前,CVSD编码将被启用。
可选的codec跟新
对AG和HF都支持CodecNegotiaton特性的SLC场景。HF可以发送AT+BAC通知AG可选codec的动态变化。如果AG已经发起Codec Connection建立过程,HF将会发起AT+BAC命令以响应AG的未经请求的+BCS命令的codec不可用的情况。

高通的人说是HF1.6支持的是mSBC解决1.5用的是CVSD
如小米6 1.6的sco连接包为mSBC
在这里插入图片描述
因此在建立SCO连接时不成功,不支持
sdp显示pts dongle此时为1.5的版本
在这里插入图片描述
为什么第一次连接会成功呢,查看一下支持的codec类型:测试平台这边 是两种解码器都支持,如果能让pts dongle变成1.6版本的,话也许可以通过连接
在这里插入图片描述
mSBC特征,取自HFP1.6协议手册
在这里插入图片描述
摘自:http://www.cnblogs.com/dylancao/p/9125221.html
蓝牙高级音频分发模型(A2DP)规定使用子带编码(SBC)为强制音频编解码系统,以保证手持电话和耳机间的互操作性。SBC是一种低复杂度的编解码技术,压缩比率适中,支持16kHz, 32kHz, 44.1kHz和48kHz的采样率,也因此成为蓝牙高清语音的当然之选。对于16kHz的宽带语音而言,SBC能以64kbps数据速率对其进行4:1的压缩。但是,当SBC编码帧通过蓝牙传输时,它可能与底层蓝牙数据包不相匹配。因此,mSBC编解码技术被开发用于匹配SBC和蓝牙数据包,并于2011年5月被定义为Bluetooth Hands-Free Profile 1.6中的强制编解码方式

窄带与宽带音频的特征如下:

CVSD: pcm: 8kHz, 16 bits, 1 channel.

      compression ratio: 16 (controller encoding)insert ratio: 8pcm data rate= 16kB/s =8K*16/8CVSD data rate=8kB/s =16kB/s* 8/16air data: **CVSD**

mSBC: pcm 16kHz, 16 bits, 1 channel.

      compression ratio: 4 (host encoding: 240->60)pcm data rate= 32kB/smSBC data rate=8kB/s = 32kB/s / 4air data: **transparent data** (mSBC)

http://chatgpt.dhexx.cn/article/i01XvZ54.shtml

相关文章

蓝牙btsnoop log,HFP协议连接流程详解,以及RFCOMM连接和常用AT指令

HFP&#xff08;Hands-Free&#xff09;&#xff1a;蓝牙免提协议,两个角色AG&#xff0c;HF端&#xff0c;AG端通常是手机设备&#xff0c;HF免提端一般为耳机车载等&#xff0c;hfp的连接首先要进行SDP&#xff0c;然后建立RFCOMM&#xff0c;然后SLC连接完成&#xff0c;HFP…

蓝牙协议HFP(Hands-Free Profile)电话免提协议 Connection management 连接管理HFP SLC 的建立跟释放

零. 概述 本文章主要讲下电话免提协议HFP&#xff08;Hands-Free Profile&#xff09;Connection management。包括connection establishment 跟connection realease&#xff0c;那connection establishment又会涉及到HFP SLC的建立过程。 本节讲解的内容就是一下HFP fea…

蓝牙A2DP和HFP编解码

一、A2DP A2DP全名是&#xff08;Advanced Audio Distribution Profile&#xff09; 蓝牙音频传输模型协定&#xff0c;提供通过蓝牙连接传输音频流的能力&#xff0c;比如手机播放音乐&#xff0c;蓝牙耳机通过蓝牙连接听歌。 mp3和flac音频编码都是在PCM音频编码基础上二次编…

Rockchip安卓11.0 16k wbs msbc HFP PCM语音通话支持

Rockchip安卓11.0 16k wbs/msbc HFP PCM语音通话支持 调试平台: 安卓11.0, rk3328, 博通ap6212芯片, HFP 8K已经调通的情况下. SDK修改支持16k wbs/msbc HFP PCM语音注意点如下: 1. bluedroid(system/bt) 博通方案中, ESCO_DATA_PATH_PCM 为1代表蓝牙芯片作为pcm master, 6…

蓝牙电话之HFP-电话音频

蓝牙电话之HFP协议中的电话音频 蓝牙技术通信的内容多种多样&#xff0c;其中音频部分包含媒体音频和电话音频。 媒体音频&#xff1a;播放蓝牙音乐的数据&#xff0c;这种音频对质量要求高&#xff0c;数据发送有重传机制&#xff0c;从而以l2cap的数据形式走ACL链路。编码方…

VSCode 按下tab键自动补全功能失效

问题描述&#xff1a;标签自动补全插件已经安装&#xff0c;某天按下tab键自动补全标签的功能突然失效了。解决方法&#xff1a; 1、找到路径 file > Preferences >settings 2、搜索tabs&#xff0c;选择Extensions里面的Emmet&#xff0c;将复选框的√打上就ok啦!

javascript 按下回车键触发input表单的切换(enter键代替tab键功能)

本来是想用js代码去模拟键盘按下来实现该功能&#xff0c;但是没有实现到。后来想到一种比较笨的方法。局限性是只能这些表单元素只能在同个层面下才能切换。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…

sublime text3 tab键功能失效

选择首选项 -> 快捷键设置 出现下面编辑页 在右边添加下面一些设置&#xff08;记得要用逗号与前面内容分开&#xff09;&#xff1a; { "keys": ["tab"], "command": "reindent", "context":[{ "key": "…

计算机键盘上的2个定位键,电脑键盘上Tab 键的神奇之处!(用途详解)

下面通过实例来详细解释下&#xff1a; 假设“D:\cfan”路径下&#xff0c;有文件夹&#xff1a; a、 ab &#xff0c;有文件&#xff1a; abc.txt &#xff0c; ac.txt 。依次点击“开始→运行”输入“cmd”&#xff0c;按下回车打开命令提示符。先输入“D:”&#xff0c;回车…

微型计算机上的tab作用,TAB键有什么用处

Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面小编来详细的介绍下几种tab键的常见功能 tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#xff0c;输入框或者链接等。例如&…

计算机键盘上的tab键是什么键,电脑Tab键有什么用处

电脑Tab键有什么用处 Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面小编来详细的介绍下几种tab键的常见用处&#xff1a; tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#x…

电脑Tab键有什么功能?6个实用功能总结!

我最近对电脑的键盘很有兴趣&#xff0c;想了解一下各个键有什么特殊的用法。今天正好看到Tab键&#xff0c;想问下大家知道电脑的Tab键有什么比较好用的功能吗&#xff1f; 在电脑键盘上&#xff0c;Tab键是一个常见的键&#xff0c;它具有多种功能和用途。无论是在文本处理、…

tab键功能

tab 键可以实现命令及路径等补全&#xff0c;提高输入效率&#xff0c;避免出错 tab键可以命令补全&#xff0c;还有路径、文件名补全。 命令补全&#xff1a; 在Linux命令行下&#xff0c;输入字符后&#xff0c;按两次Tab键&#xff0c;shell就会列出以这些字符打头的所有…

计算机键盘上的tab键是什么键,键盘Tab键有什么作用?

Tab键——跳格键&#xff0c;大家都比较熟悉了吧&#xff0c;但是到底它有什么特殊的使用功能&#xff0c;却未必是大家都知道的哦。今天就将Tab键的几种使用功能进行了整理&#xff0c;大家可以参考学习学习。 1、跳格。当我们在网页输入表单的时候&#xff0c;在一个输入控件…

电脑Tab键有什么用

Tab键对大家来说都是比较熟悉吧。比如写文章时开头要空两格就可用这个键。但是它还有什么特殊功能呢&#xff0c;不一定是大家都知道的。下面我来详细的介绍下几种tab键的常见用处&#xff1a; tab键作用一&#xff1a;改变焦点 聚焦到下一个按钮&#xff0c;输入框或者链接等…

电脑Tab键有什么功能?分享Tab键的6个妙用

Tab键tabulator key 的缩写&#xff0c;意思是跳格键。基本用法是可以用来绘制无边框的表格&#xff0c;还可以在单词间留下间隔&#xff0c;一般等于八个空格的长度。但是您知道电脑Tab键有什么功能吗&#xff1f;以下一些关于Tab键的使用和功能的介绍&#xff0c;希望这些可以…

matlab EOF程序

% eof第一模态图用变量eof的第一列&#xff0c;以此类推&#xff1b;相应的时间系数用pc第一行 clear clcx [2 6 1 5 2;9 4 0 5 4;12 2 55 9 10;4 55 78 2 13]; %原始数据&#xff0c;列为站点或格点&#xff0c;行为时间序列上的值 x(1,:) x(1,:) - mean(x(1,:)); x(…

C语言——EOF的用法——while(scanf(“%d“,num)!=EOF)

简介&#xff1a; EOF是一个计算机术语&#xff0c;为End Of File的缩写&#xff0c;在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。、 概念&#xff1a; 在C语言中&#xff0c;或更精确地说成C标准函数库中…

cat << EOF 什么意思?

cat <<EOF 什么意思&#xff1f; cat命令表示查看&#xff0c;而cat <<EOF命令表示将进行输入&#xff0c;直到以EOF终止符来结束输入&#xff08;最后的新行&#xff09;。EOF必须写在一行的头部&#xff0c;前面不能有制表符或者空格。如果结束符EOF前面有制表符…

【C语言中的EOF】零基础看懂EOF如何使用while(scanf(“%d %d”,a,b)感叹号=EOF)

&#x1f31f;前言 ✨如今我们努力奔跑&#xff0c;不过是为了追上那个曾经被寄予厚望的自己&#xff01; 【&#x1f47b;&#x1f47b;&#x1f47b;大家好&#xff0c;我是姜姜爱柚子&#xff0c;将在这里分享所学所得&#xff0c;如果有不正确的地方&#xff0c;希望大家多…